日誌檔案:恢復的基石
預寫日誌協議
鐵律:先寫日誌,後寫資料庫。兩個操作間可能發生故障:
- 先寫資料庫、日誌未記錄 → 無法恢復該修改
- 先寫日誌、資料庫未修改 → 恢復時多執行一次 UNDO,不影響正確性
日誌記錄內容:事務標識、操作類型、操作對象、修改前值、修改後值。
三類故障與恢復策略
| 故障類型 | 特徵 | 恢復方法 | 自動化程度 |
| 事務故障 |
單一事務非正常終止(邏輯錯誤、死鎖、溢位) |
反向掃描日誌,對該事務執行 UNDO(逆操作) |
系統自動,對用戶透明 |
| 系統故障 |
軟體/硬體錯誤導致重啟,緩衝區資料丟失 |
正向掃描建立 REDO/UNDO 隊列 → UNDO 未完成事務 → REDO 已提交事務 |
重啟時自動完成 |
| 介質故障 |
磁碟損壞、磁頭碰撞等硬體損壞 |
重裝最近備份 + 重放日誌(REDO 已提交 + UNDO 未完成) |
需 DBA 介入 |
系統故障恢復詳細流程
- 正向掃描日誌建立兩隊列:
- REDO 隊列:有 BEGIN 與 COMMIT 記錄
- UNDO 隊列:僅有 BEGIN,無 COMMIT
- 反向掃描對 UNDO 隊列事務執行逆操作(插入→刪除、刪除→插入、修改→還原舊值)
- 正向掃描對 REDO 隊列事務重新執行操作(寫入修改後值)
介質故障恢復流程
- 裝入最近備份(靜態備份直接一致;動態備份需配合備份時刻日誌做 REDO+UNDO 達一致)
- 裝入備份結束時刻起的日誌檔案
- 掃描日誌建立 REDO/UNDO 隊列
- 正向 REDO、反向 UNDO

檢查點技術:大幅提升恢復效率
動態維護檢查點步驟
- 將日誌緩衝區強制刷入磁碟
- 寫入檢查點記錄(含當前活躍事務清單、其最近日誌位址)
- 將資料緩衝區強制刷入磁碟
- 將檢查點位址寫入重新開始檔案
可定期(時間間隔)或不定期(日誌寫滿比例)建立。
利用檢查點的恢復策略
僅需從最後一個檢查點開始掃描:
- 檢查點前已提交事務(T1):無需 REDO(資料已刷盤)
- 檢查點前開始、檢查點後提交(T2):需 REDO(可能未刷盤)
- 檢查點前開始、故障時未完成(T3):需 UNDO
- 檢查點後開始、故障前提交(T4):需 REDO
- 檢查點後開始、故障時未完成(T5):需 UNDO
資料庫鏡像:容災與並發優化
- DBMS 自動將整庫或關鍵資料複寫至另一磁碟
- 更新時同步複寫,保證一致性
- 並發優势:獨佔鎖修改主庫時,其他用戶可讀鏡像庫,無需等待鎖釋放
- 成本:頻繁複寫降低效能,實務上常僅鏡像關鍵資料與日誌
恢復技術總覽
| 技術 | 核心原理 | 適用故障 | 效率提升手段 |
| 資料庫轉儲 | 定期完整/增量備份 | 介質故障 | 海量 vs 增量權衡 |
| 日誌檔案 | 記錄所有修改操作 | 所有故障 | 檢查點減少掃描範圍 |
| 鏡像 | 即時複寫關鍵資料 | 介質故障 | 縮短 RTO,並發讀取優化 |