檢查點核心目的
- 以**最小影響**業務的方式刷新髒塊
- 保障資料一致性
- 實例崩潰時**快速恢復**
演進歷程
- 8i 前:完全檢查點 — 鎖定所有修改、刷新所有髒塊,**嚴重影響效能**
- 9i 起:僅關庫時觸發完全檢查點
- 8i 引入:增量檢查點 — **定期刷新部分髒塊**
增量檢查點核心資料結構:檢查點隊列
- Buffer Cache 中建立雙向鏈表
- 塊變髒時 → **掛到隊列尾部**
- 節點資訊:塊在 Cache 位置、對應 Redo 在 Redo Log 位置、前後節點指標
- 隊列頭 = **最早變髒的塊** = **檢查點位置 (Checkpoint Position)**
DBWn 刷新流程
- CKPT 進程每 **3 秒** 將當前檢查點位置寫入**控制檔**
- 定期喚醒 DBWn 從隊列頭開始順序刷新髒塊
- 刷新完成的塊從隊列移除,新髒塊持續加入尾部
實例恢復機制
- 資料庫啟動 → 讀取控制檔中的**檢查點位置**
- 根據位置記錄的 Redo 起始點,順序讀取 Redo Log
- 重放所有 Redo 記錄 → **將用戶提交的修改全部重現**
- 未提交事務的 Redo 即使遺失也不影響,因需回滾
**前提**:Redo Log 檔案完整 (建議 RAID 1 / 多路鏡像)。
髒塊與髒 LRU 鏈優化
- 髒塊不可直接覆蓋 (含未持久化修改)
- LRU 冷端掃描犧牲塊時發現髒塊 → 移入**髒 LRU 鏈**
- 下次掃描直接跳過髒 LRU,**減少無效檢查**
- 髒 LRU 達閾值 → 喚醒 DBWn 刷新
關鍵等待事件
free buffer waits:LRU 掃描犧牲塊耗時過長,通常因髒塊過多、DBWn 刷新跟不上
- 對策:增加 DBWn 進程數、調大
_db_block_write_batch、改用大頁面記憶體
總結
增量檢查點 + 檢查點隊列 + CKPT 進程 + DBWn 協作,實現**高併發下的髒塊平滑刷新**與**秒級實例恢復**,是 Oracle 高可用核心基石。