db2事務日誌滿解決方法
故障描述
在刪除一個表裡8萬多條資料的時候報瞭如下錯誤:
SQL0964C The transaction log for the database is full,用db2 ? sql0964c查幫助,確定是事務日誌滿。
解決方法
增大每個事務日誌檔案大小,增加主日誌檔案數量和第二事務日誌數量
db2 update db cfg for <dbname> using LOGPRIMARY 50
db2 update db cfg for <dbname> using LOGSECOND 20
db2 update db cfg for <dbname> using LOGFILSIZ 10240
重啟資料庫,再刪除。成功。
IBM的解答
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
驗證應用是否已被真正停止。