應用程式拋出 SQLState: 57011、SQLCODE: -964,訊息為「The transaction log for the database is full」(資料庫交易日誌已滿)。此錯誤意味著作用中日誌空間耗盡,資料庫無法再寫入新的交易記錄,導致所有寫入操作(INSERT/UPDATE/DELETE)中斷。
DB2 採用循環日誌機制,主要日誌檔(Primary Log Files)與次要日誌檔(Secondary Log Files)共同構成日誌空間。當交易量激增、長時間執行的大量交易未提交、或備份/複寫延遲導致日誌無法被循環覆寫時,日誌空間即會耗盡。關鍵配置參數包括:
總日誌空間上限 ≈ (LOGPRIMARY + LOGSECOND) × LOGFILSIZ × 4 KB。
連線資料庫後執行:
db2 "get db cfg for <dbname> | grep -i log"
典型預設輸出範例:
Log file size (4KB) (LOGFILSIZ) = 1024 (每檔 4 MB) Number of primary log files (LOGPRIMARY) = 3 Number of secondary log files (LOGSECOND) = 1
此配置總空間僅 (3+1) × 4 MB = 16 MB,極易滿載。
適合:日誌寫入吞吐量高,欲減少檔案切換開銷。
db2 "update db cfg for <dbname> using LOGFILSIZ 4096"
將檔案從 4 MB 增至 16 MB(4096 × 4 KB)。修改後需重新啟動資料庫生效(db2 deactivate db <dbname> → db2 activate db <dbname>)。
適合:穩定提高基礎日誌容量,避免頻繁動態分配次要檔案的效能抖動。
db2 "update db cfg for <dbname> using LOGPRIMARY 6"
由 3 增至 6,基礎容量倍增。同樣需重啟資料庫生效。
適合:應對偶發性交易尖峰,平時不佔用空間,尖峰時動態擴展。
db2 "update db cfg for <dbname> using LOGSECOND 10"
由 1 增至 10,提供彈性緩衝。此參數即時生效,無需重啟資料庫,風險最低、操作最便利。
| 場景 | 建議優先調整 | 備註 |
|---|---|---|
| 持續高載寫入、日誌切換頻繁 | LOGFILSIZ + LOGPRIMARY | 需重啟,規劃維護窗口 |
| 平時穩定、偶發大批次作業 | LOGSECOND | 即時生效,零停機 |
| 高可用環境 | 三者兼顧 + 定期離線備份 | 確保日誌可被循環覆寫 |
AUTO_MAINT、AUTO_DB_BACKUP 確保定期備份釋放日誌空間。MON_GET_TRANSACTION_LOG 或設定告警,於使用率達 70% 時預警。db2 "update db cfg for <dbname> using LOGSECOND 20" 緊急擴容(即時生效)。掌握日誌三參數的交互關係,並建立監控與預警機制,即可徹底杜絕 -964 錯誤對業務的衝擊。