Posted on 2008-12-25 15:03
Prayer 閱讀(1079)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
DB2
環(huán)境:
產(chǎn)品:DB2 UDB
平臺(tái):跨平臺(tái)
版本:8
問題描述:
DB2 使用的活動(dòng)日志的最大空間是由下面公式:
(logprimary + logsecond) * logfilsiz * 4096
計(jì)算出的大小來決定的(logprimary,logsecond,logfilsiz是數(shù)據(jù)庫(kù)配置參數(shù))。若該空
間已全部被分配,而應(yīng)用仍試圖請(qǐng)求更多活動(dòng)日志空間時(shí),就會(huì)發(fā)生日志滿的情況,此時(shí),
用戶的更新、刪除或插入操作都會(huì)使 DB2DIAG.LOG 中寫入以下信息:
SQL0964C 數(shù)據(jù)庫(kù)的事務(wù)日志已滿。
DB2 活動(dòng)日志滿通常是由于存在大量未提交事務(wù)的數(shù)據(jù),使得活動(dòng)日志的空間不能及時(shí)釋放
,使新的事務(wù)無法申請(qǐng)到可用日志空間,而最終報(bào)出 SQL0964C 的錯(cuò)誤所致。為使應(yīng)用程序
成功運(yùn)行,而不是被回滾,通常會(huì)考慮根據(jù)情況選擇增大以上公式中的某些數(shù)據(jù)庫(kù)參數(shù),以
增大活動(dòng)日志空間來解決這一問題。
但還有另外一種原因,即在日志空間并未用盡的情況下,當(dāng)某個(gè)占有最舊活動(dòng)日志的應(yīng)用長(zhǎng)
時(shí)間未作提交操作,阻止了日志的 LSN 的分配,造成日志空間無法使用,同樣會(huì)引發(fā)這一日
志滿的報(bào)錯(cuò)。對(duì)于這種情況,可以提交該交易或利用 FORCE 命令來終止此應(yīng)用程序,以便釋
放它所占用的日志空間,使 LSN 可以繼續(xù)分配,空閑的日志空間可用。這里就提供了由這一
原因?qū)е氯罩緷M問題的解決方法。
解答:
首先檢查 DB2 診斷日志文件 db2diag.log,在其中查找類似如下信息:
2003-01-16-02.53.54.935308 Instance:db2inst1 Node:016
PID:144252(db2agntp (SAMPLE) 16) Appid:*.*
data_protection sqlpgrsp Probe:50 Database:SAMPLE
Log Full -- active log held by appl. handle 787273
End this application by COMMIT, ROLLBACK or FORCE APPLICATION.
:
:
由此,可以找到最早持有日志空間的應(yīng)用程序,其句柄為 787273。如果使用 DB2 的快照工
具,通過從快照的輸出中查找類似以下信息:
Appl id holding the oldest transaction = 787273
同樣可以找到這個(gè)應(yīng)用程序的句柄。這時(shí)使用以下命令可以在無需斷開數(shù)據(jù)庫(kù)其它應(yīng)用程序
的連接的情況下強(qiáng)行終止該應(yīng)用程序:
db2 force application (787273)
DB20000I FORCE APPLICATION 命令成功完成。
DB21024I 該命令為異步的,可能不會(huì)立即生效。
根據(jù)提示,由于該命令是異步操作,可再次使用:
db2 list applications
驗(yàn)證應(yīng)用是否已被真正停止,如果輸出中已沒有該應(yīng)用,它所占有的日志空間會(huì)因應(yīng)用程序
被回滾而立即釋放,而 DB2 日志因此重新可用。