首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 檢查點 (Checkpoint) 機制深度剖析:增量檢查點、CKPT 進程與實例恢復

     編輯:Oracle 資料庫基礎

檢查點核心目的

  • 以**最小影響**業務的方式刷新髒塊
  • 保障資料一致性
  • 實例崩潰時**快速恢復**

演進歷程

  • 8i 前:完全檢查點 — 鎖定所有修改、刷新所有髒塊,**嚴重影響效能**
  • 9i 起:僅關庫時觸發完全檢查點
  • 8i 引入:增量檢查點 — **定期刷新部分髒塊**

增量檢查點核心資料結構:檢查點隊列

  • Buffer Cache 中建立雙向鏈表
  • 塊變髒時 → **掛到隊列尾部**
  • 節點資訊:塊在 Cache 位置、對應 Redo 在 Redo Log 位置、前後節點指標
  • 隊列頭 = **最早變髒的塊** = **檢查點位置 (Checkpoint Position)**

DBWn 刷新流程

  1. CKPT 進程每 **3 秒** 將當前檢查點位置寫入**控制檔**
  2. 定期喚醒 DBWn 從隊列頭開始順序刷新髒塊
  3. 刷新完成的塊從隊列移除,新髒塊持續加入尾部

實例恢復機制

  1. 資料庫啟動 → 讀取控制檔中的**檢查點位置**
  2. 根據位置記錄的 Redo 起始點,順序讀取 Redo Log
  3. 重放所有 Redo 記錄 → **將用戶提交的修改全部重現**
  4. 未提交事務的 Redo 即使遺失也不影響,因需回滾

**前提**:Redo Log 檔案完整 (建議 RAID 1 / 多路鏡像)。

髒塊與髒 LRU 鏈優化

  • 髒塊不可直接覆蓋 (含未持久化修改)
  • LRU 冷端掃描犧牲塊時發現髒塊 → 移入**髒 LRU 鏈**
  • 下次掃描直接跳過髒 LRU,**減少無效檢查**
  • 髒 LRU 達閾值 → 喚醒 DBWn 刷新

關鍵等待事件

  • free buffer waits:LRU 掃描犧牲塊耗時過長,通常因髒塊過多、DBWn 刷新跟不上
  • 對策:增加 DBWn 進程數、調大 _db_block_write_batch、改用大頁面記憶體

總結

增量檢查點 + 檢查點隊列 + CKPT 進程 + DBWn 協作,實現**高併發下的髒塊平滑刷新**與**秒級實例恢復**,是 Oracle 高可用核心基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved