當遇到 SQL0946C The transaction log for the database is full 錯誤時,理解事務日誌的核心機制至關重要。本文深入剖析 DB2 事務日誌的架構、寫前日誌 (WAL) 協議、緩衝區刷新機制,以及資料庫崩潰後如何利用日誌實現 重做 與 回滾 達到一致性恢復的完整原理。
事務是一個或多個 SQL 操作序列,具備原子性:全做或全不做。事務邊界由隱式啟動(首條 SQL)、COMMIT(永久生效)或 ROLLBACK(撤銷)定義。未提交的修改對其他連接不可見(除非 UR 隔離級)。
LOGBUFSZ 控制),記錄:INSERT 新值、DELETE 舊值、UPDATE 前後值(通常用 XOR 差異)、COMMIT/ROLLBACK 結束標記。觸發條件(任一即刷新):
COMMIT / ROLLBACK(強制刷新,保證持久性)此為 Write-Ahead Logging (WAL) 核心:修改資料頁落盤前,對應日誌記錄必須已落盤。最大程度減少崩潰時丟失的日誌量。
LOGPRIMARY) 循環覆寫,不足時動態分配次日誌 (LOGSECOND)。LOGRETAIN=ON/USEREXIT=ON):主日誌檔寫滿後不覆寫,改由用戶退出程式歸檔至異地,支援時間點恢復 (PITR)。資料庫啟動時若發現非正常關閉,自動執行 Crash Recovery:
Checkpoint) 開始掃描日誌。完成後,資料庫進入 交易一致 狀態,所有已提交事務持久化,未提交事務痕跡清除。
| 參數 | 作用 | 調優建議 |
|---|---|---|
| LOGFILSIZ | 單一日誌檔大小 (4KB 頁數) | 大檔案減少切換頻率,但增加歸檔傳輸單位 |
| LOGPRIMARY | 主日誌檔預分配數量 | 設定為可容納高峰期單位時間事務量,避免頻繁分配次日誌 |
| LOGSECOND | 允許的次日誌檔上限 | 設為 -1 啟用無限活動日誌(需配合 USEREXIT),防止日誌滿錯誤 |
| LOGBUFSZ | 日誌緩衝區大小 | 大批量載入時適當調大,減少刷新等待 |
| MIRRORLOGPATH | 鏡像日誌路徑 | 務必設定在不同物理磁碟,防單點故障 |
| SOFTMAX | 觸發警告的日誌使用率閾值 | 設 80-90%,留足應急處理時間 |
設定 USEREXIT=YES, LOGSECOND=-1。活動事務可跨越主日誌與歸檔日誌,理論上無日誌空間上限。權衡:回滾與崩潰恢復變慢(需從歸檔抓取日誌),適合超大事務、極高可用性要求場景。
理解 WAL 與雙階段恢復,是排查日誌滿、效能抖動、災難恢復失敗的理論基石。建議 DBA 定期演練 db2dart、db2ckbkp 驗證日誌與備份可用性。