您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么實(shí)現(xiàn)DB2數(shù)據(jù)庫事務(wù)日志已滿的分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
某日下午,開發(fā)報(bào)告說在執(zhí)行DML操作時(shí),數(shù)據(jù)庫報(bào)事務(wù)日志已滿的錯(cuò)誤。
db2diag.log數(shù)據(jù)庫日志中的報(bào)錯(cuò)信息:
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
APPHDL : 0-1103 APPID: GA0429B5.F627.130401082711
FUNCTION: DB2 UDB, data protection, sqlpgResSpace, probe:2860
MESSAGE : ADM1823E The active log is full and is held by application handle
"1103". Terminate this application by COMMIT, ROLLBACK or FORCE
APPLICATION.
客戶端具體信息如下:
$db2 delete from tzsdb01
DB21034E 該命令被當(dāng)作 SQL 語句來處理,因?yàn)樗皇怯行У摹懊钚刑幚砥鳌泵睢?br/>在 SQL 處理期間,它返回:
SQL0964C 數(shù)據(jù)庫的事務(wù)日志已滿。 SQLSTATE=57011
這個(gè)問題的原因是:表中數(shù)據(jù)量過大,delete 時(shí),會寫入日志,但日志容量過小。
解決方法: 增大日志容量、數(shù)據(jù)量 或 減少一次的刪除數(shù)據(jù)量,分多次刪除。
生產(chǎn)環(huán)境為避免白天停庫,提示開發(fā)分多次刪除,這樣就不出錯(cuò)了。但是要徹底解決這個(gè)問題,還需申請停庫修改數(shù)據(jù)庫參數(shù)。
我們先看一下,數(shù)據(jù)庫的關(guān)于日志的配置參數(shù)
$ 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
然后停止應(yīng)用,停庫再啟庫就生效了
$db2 force applications all
$db2stop
$db2start
如果需要增大日志的數(shù)據(jù)量則需要進(jìn)行計(jì)算和這樣設(shè)置,這時(shí)日志容量已變?yōu)?192
Log file size (4KB) (LOGFILSIZ) = 8192
Number of primary log files (LOGPRIMARY) = 10
Number of secondary log files (LOGSECOND) = 4
現(xiàn)在的日志數(shù)據(jù)量為
計(jì)算公式如下:
數(shù)據(jù)庫事務(wù)日志的數(shù)據(jù)量大小 = ( LOGPRIMARY + LOGSECOND )* LOGFILSIZ * 4KB
即:
( 10 + 4)* 8192 * 4KB = 458752 K = 458 M (大約數(shù))
下面斷開此數(shù)據(jù)庫的所有連接
修改主日志文件個(gè)數(shù): db2 update db cfg for <dbname> using LOGPRIMARY 15
修改輔助日志文件個(gè)數(shù):db2 update db cfg for <dbname> using LOGSECOND 10
這時(shí)的大小=(15+10)*8192*4KB=819200K=819M (大約數(shù))
然后停庫再啟庫,問題得到解決。
注:LOGPRIMARY+LOGSECOND不能超過255,日志空間大小不能超過256G。對于LOGPRIMARY和LOGFILSIZ參數(shù)的修改需要斷開連接,重連數(shù)據(jù)庫才能生效。LOGSECOND參數(shù)的修改則立即生效,對于生產(chǎn)系統(tǒng)比較快的應(yīng)急解決辦法,可以直接先修改此參數(shù)。
補(bǔ)充知識:
1,主日志文件的數(shù)目 LOGPRIMARY
此數(shù)據(jù)庫配置參數(shù)用來指定要預(yù)分配的主日志文件個(gè)數(shù)。主日志文件建立分配給恢復(fù)日志文件的固定存儲器數(shù)量。在循環(huán)日志管理模式下,數(shù)據(jù)庫事務(wù)將按順序重復(fù)使用主日志,也就是當(dāng)一個(gè)主日志已滿時(shí),順序使用下一個(gè)主日志,如果主日志已滿,則按需一次分配一個(gè)輔助日志,輔助日志在使用完后,將被釋放。如果你發(fā)現(xiàn)數(shù)據(jù)庫會經(jīng)常分配輔助日志文件,則可能需要通過增大日志文件大小或增大主日志文件的數(shù)目來提高系統(tǒng)性能。
2,輔助日志文件的數(shù)目 LOGSECOND
此數(shù)據(jù)庫配置參數(shù)用來指定按需分配的輔助日志文件個(gè)數(shù)。盡量不要把此參數(shù)的值設(shè)置成“ -1 ” ,“ -1 ”代表你在請求一個(gè)無限的活動日志空間,數(shù)據(jù)庫也不會報(bào)數(shù)據(jù)庫事務(wù)日志已滿錯(cuò)誤,如果空間不足則會報(bào)日志磁盤已滿錯(cuò)誤。
3,日志文件大小 LOGFILSIZ
此數(shù)據(jù)庫配置參數(shù)用來指定日志文件的大小。
4,數(shù)據(jù)庫事務(wù)日志已滿錯(cuò)誤
數(shù)據(jù)庫事務(wù)日志已滿錯(cuò)誤是指當(dāng)前事務(wù)無法寫入到活動日志中(此時(shí)主日志文件和輔助日志文件已經(jīng)全部用完或者沒有足夠當(dāng)前事務(wù)寫入的空間),需要注意的是,這個(gè)錯(cuò)誤和日志磁盤空間已滿是兩個(gè)概念。數(shù)據(jù)庫事務(wù)日志已滿不是由于磁盤空間滿引起的,而是由于沒有落實(shí)的事務(wù)總體過大,超過了數(shù)據(jù)庫事務(wù)日志所能容納的最大大小所造成的。
當(dāng)出現(xiàn)這樣的錯(cuò)誤時(shí),不要嘗試使用 DB2STOP FORCE 命令來強(qiáng)制停掉數(shù)據(jù)庫,建議大家使用 FORCE APPLICATION 命令停掉引起這個(gè)錯(cuò)誤的應(yīng)用程序或者停掉所有的應(yīng)用程序。也不建議大家使用 KILL 命令來殺掉任何 DB2 相關(guān)的進(jìn)程。如果 使用DB2STOP FORCE命令hang住了,最后再嘗試殺掉進(jìn)程,重新DB2START或重啟服務(wù)器。
關(guān)于怎么實(shí)現(xiàn)DB2數(shù)據(jù)庫事務(wù)日志已滿的分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。