DB2資料庫事務日誌已滿案例解析

2021-09-05 05:13:26 字數 3833 閱讀 6972

某日下午,開發報告說在執行dml操作時,資料庫報事務日誌已滿的錯誤。

db2diag.log資料庫日誌中的報錯資訊:

2013-04-01-16.43.30.736907+480 e2147482982c502    level: error

pid     : 126660               tid  : 1           proc : db2agent (sso) 0

instance: db2inst1             node : 000         db   : sso

function: db2 udb, data protection, sqlpgresspace, probe:2860

客戶端具體資訊如下:

$db2 delete from tzsdb01

db21034e  該命令被當作 sql 語句來處理,因為它不是有效的「命令列處理器」命令。

在 sql 處理期間,它返回:

sql0964c  資料庫的事務日誌已滿。  sqlstate=57011

這個問題的原因是:表中資料量過大,delete 時,會寫入日誌,但日誌容量過小。

解決方法:  增大日誌容量、資料量

或 減少一次的刪除資料量,分多次刪除。

生產環境為避免白天停庫,提示開發分多次刪除,這樣就不出錯了。但是要徹底解決這個問題,還需申請停庫修改資料庫引數。

我們先看一下,資料庫的關於日誌的配置引數

$ db2 get db cfg for tzsdb01

database configuration for database zssqdb01

database configuration release level                    = 0x0d00

database release level                                  = 0x0d00

database territory                                      = cn

database code page                                      = 1208

database code set                                       = utf-8

database country/region code                            = 86

database collating sequence                             = identity

multi-page file allocation enabled                      = yes

log retain for recovery status                          = recovery

user exit for logging status                            = yes

database heap (4kb)                            (dbheap) = automatic(2626)

catalog cache size (4kb)              (catalogcache_sz) = 300

log buffer size (4kb)                        (logbufsz) = 4096

log file size (4kb)                         (logfilsiz) = 1024

number of primary log files                (logprimary) = 10

number of secondary log files               (logsecond) = 4

changed path to log files                  (newlogpath) =

path to log files                                       = /home/db2inst1/db2inst1/node0000/sql00001/sqlogdir/

先看增大日誌的容量,注意紅色的值為1024

$db2 update db cfg for zssqdb01 using logfilsiz 8192           將其增大到8192

然後停止應用,停庫再啟庫就生效了

$db2stop

$db2start

如果需要增大日誌的資料量則需要進行計算和這樣設定,這時日誌容量已變為8192

log file size (4kb)                         (logfilsiz) =8192

number of primary log files                (logprimary) = 10

number of secondary log files               (logsecond) = 4

現在的日誌資料量為

計算公式如下:

資料庫事務日誌的資料量大小 = ( logprimary + logsecond )* logfilsiz * 4kb

即:( 10 + 4)* 8192 * 4kb = 458752 k = 458 m  (大約數)

下面斷開此資料庫的所有連線

修改主日誌檔案個數:    db2 update db cfg for using logprimary 15

修改輔助日誌檔案個數:db2 update db cfg for using logsecond 10

這時的大小=(15+10)*8192*4kb=819200k=819m (大約數)

然後停庫再啟庫,問題得到解決。

注:logprimary+logsecond不能超過255,日誌空間大小不能超過256g。對於logprimary和logfilsiz引數的修改需要斷開連線,重連資料庫才能生效。logsecond引數的修改則立即生效,對於生產系統比較快的應急解決辦法,可以直接先修改此引數。

補充知識:

1,主日誌檔案的數目 logprimary

此資料庫配置引數用來指定要預分配的主日誌檔案個數。主日誌檔案建立分配給恢復日誌檔案的固定儲存器數量。在迴圈日誌管理模式下,資料庫事務將按順序重複使用主日誌,也就是當乙個主日誌已滿時,順序使用下乙個主日誌,如果主日誌已滿,則按需一次分配乙個輔助日誌,輔助日誌在使用完後,將被釋放。如果你發現資料庫會經常分配輔助日誌檔案,則可能需要通過增大日誌檔案大小或增大主日誌檔案的數目來提高系統效能。

2,輔助日誌檔案的數目 logsecond

此資料庫配置引數用來指定按需分配的輔助日誌檔案個數。盡量不要把此引數的值設定成「 -1 」 ,「 -1 」代表你在請求乙個無限的活動日誌空間,資料庫也不會報資料庫事務日誌已滿錯誤,如果空間不足則會報日誌磁碟已滿錯誤。

3,日誌檔案大小 logfilsiz

此資料庫配置引數用來指定日誌檔案的大小。

4,資料庫事務日誌已滿錯誤

資料庫事務日誌已滿錯誤是指當前事務無法寫入到活動日誌中(此時主日誌檔案和輔助日誌檔案已經全部用完或者沒有足夠當前事務寫入的空間),需要注意的是,這個錯誤和日誌磁碟空間已滿是兩個概念。資料庫事務日誌已滿不是由於磁碟空間滿引起的,而是由於沒有落實的事務總體過大,超過了資料庫事務日誌所能容納的最大大小所造成的。

DB2資料庫事務日誌已滿問題解決方案

db2資料庫事務日誌已滿問題解決方案 文章分類 資料庫 1 資料庫事務日誌的最大大小 資料庫事務日誌的最大大小由資料庫的三個配置引數決定,分別是 主日誌檔案的數目 logprimary 輔助日誌檔案的數目 logsecond 和 日誌檔案大小 4kb logfilsiz 資料庫事務日誌的最大大小的計...

db2 事務日誌

db2增刪改都會涉及事務,以便於出錯時候能夠回滾。當日誌滿了,還要繼續新增日誌,就會報 964的錯誤 db2檢視日誌的命令是 檢視資料庫的配置引數 get db cfg for 檢視出很多配置資訊,下面幾項是我們的日誌資訊 log file size 4kb logfilsiz 1024 numbe...

db2資料庫解掛

連線資料庫 db2 connect to 資料庫名 檢視表空間狀態 db2 list tablespaces show detail 正常狀態為 0x0000 處於 0x0004 停頓的獨佔 解決 db2 select tabname from syscat.tables where tablid ...