某日下午,開發報告說在執行DML操作時,資料庫報交易記錄已滿的錯誤。具體資訊如下:
$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
Self tuning memory (SELF_TUNING_MEM) = ON
Size of database shared memory (4KB) (DATABASE_MEMORY) = AUTOMATIC(1662183)
Database memory threshold (DB_MEM_THRESH) = 10
Max storage for lock list (4KB) (LOCKLIST) = AUTOMATIC(130720)
Percent. of lock lists per application (MAXLOCKS) = AUTOMATIC(97)
Package cache size (4KB) (PCKCACHESZ) = AUTOMATIC(421273)
Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = AUTOMATIC(46809)
Sort list heap (4KB) (SORTHEAP) = AUTOMATIC(9361)
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
然後停止應用,停庫再啟庫就生效了
$db2 force applications all
$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 <dbname> using LOGPRIMARY 15
修改輔助記錄檔個數:db2 update db cfg for <dbname> 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,資料庫交易記錄已滿錯誤
資料庫交易記錄已滿錯誤是指當前事務無法寫入到活動紀錄中此時主記錄檔和輔助記錄檔已經全部用完或者沒有足夠當前事務寫入的空間),需要注意的是,這個錯誤和日誌磁碟空間已滿是兩個概念。資料庫交易記錄已滿不是由於磁碟空間滿引起的,而是由於沒有落實的事務總體過大,超過了資料庫交易記錄所能容納的最大大小所造成的。
當出現這樣的錯誤時,不要嘗試使用 DB2STOP FORCE 命令來強制停掉資料庫,建議大家使用 FORCE APPLICATION 命令停掉引起這個錯誤的應用程式或者停掉所有的應用程式。也不建議大家使用 KILL 命令來殺掉任何 DB2 相關的進程。如果 使用DB2STOP FORCE命令hang住了,最後再嘗試殺掉進程,重新DB2START或重啟伺服器。
本文出自 “滴水穿石” 部落格,請務必保留此出處http://xjsunjie.blog.51cto.com/999372/1219692