Posted on 2008-12-25 15:03
Prayer 閱讀(1079)
評論(0) 編輯 收藏 引用 所屬分類:
DB2
環境:
產品:DB2 UDB
平臺:跨平臺
版本:8
問題描述:
DB2 使用的活動日志的最大空間是由下面公式:
(logprimary + logsecond) * logfilsiz * 4096
計算出的大小來決定的(logprimary,logsecond,logfilsiz是數據庫配置參數)。若該空
間已全部被分配,而應用仍試圖請求更多活動日志空間時,就會發生日志滿的情況,此時,
用戶的更新、刪除或插入操作都會使 DB2DIAG.LOG 中寫入以下信息:
SQL0964C 數據庫的事務日志已滿。
DB2 活動日志滿通常是由于存在大量未提交事務的數據,使得活動日志的空間不能及時釋放
,使新的事務無法申請到可用日志空間,而最終報出 SQL0964C 的錯誤所致。為使應用程序
成功運行,而不是被回滾,通常會考慮根據情況選擇增大以上公式中的某些數據庫參數,以
增大活動日志空間來解決這一問題。
但還有另外一種原因,即在日志空間并未用盡的情況下,當某個占有最舊活動日志的應用長
時間未作提交操作,阻止了日志的 LSN 的分配,造成日志空間無法使用,同樣會引發這一日
志滿的報錯。對于這種情況,可以提交該交易或利用 FORCE 命令來終止此應用程序,以便釋
放它所占用的日志空間,使 LSN 可以繼續分配,空閑的日志空間可用。這里就提供了由這一
原因導致日志滿問題的解決方法。
解答:
首先檢查 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.
:
:
由此,可以找到最早持有日志空間的應用程序,其句柄為 787273。如果使用 DB2 的快照工
具,通過從快照的輸出中查找類似以下信息:
Appl id holding the oldest transaction = 787273
同樣可以找到這個應用程序的句柄。這時使用以下命令可以在無需斷開數據庫其它應用程序
的連接的情況下強行終止該應用程序:
db2 force application (787273)
DB20000I FORCE APPLICATION 命令成功完成。
DB21024I 該命令為異步的,可能不會立即生效。
根據提示,由于該命令是異步操作,可再次使用:
db2 list applications
驗證應用是否已被真正停止,如果輸出中已沒有該應用,它所占有的日志空間會因應用程序
被回滾而立即釋放,而 DB2 日志因此重新可用。