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

Oracle COMMIT 內部機制全解析:LGWR/DBWN 協作、檢查點類型、實例恢復前滾回滾邏輯

     編輯:Oracle 資料庫基礎

COMMIT 不只是標記交易結束,更觸發 Redo 生成、LGWR 寫入、SCN 推進、鎖釋放協調的一連串核心動作。理解其內部流程,才能掌握恢復機制與效能調優關鍵。

一、COMMIT 觸發鏈路

  1. 所有受影響塊已讀入 Buffer Cache、Redo 已入 Log Buffer。
  2. COMMIT → 觸發 **LGWR** 將 Log Buffer 寫入 Online Redo Log (同步寫入,確保持久化)。
  3. **不強制立即觸發 DBWN**;DBWN 稍後批次寫髒塊,鎖 (行鎖/ITL) 於 DBWN 完成後釋放。
  4. Undo 標記 Committed;產生 Commit SCN 寫入塊頭 (覆蓋先前 DML SCN)。
  5. Commit 後不可 Rollback,保障後續 DBWN 動作不被中斷。

二、檢查點觸發條件 (7 種)

僅 4、7 為**完全檢查點** (寫盡所有髒塊);其餘為增量檢查點。

三、完全檢查點流程

  1. 記錄 Checkpoint SCN、當前最新 Redo RBA。
  2. DBWN 寫入 RBA 前所有髒塊 (忽略檢查點期間新產生的修改)。
  3. 更新控制檔 Checkpoint SCN/RBA、每個資料檔頭 Checkpoint SCN → 標示資料庫一致。

四、日誌切換檢查點細節

  • LGWR 寫滿 Log Group 2 → 觸發檢查點 → 系統核對 Group 3 對應塊是否已寫入資料檔。
  • 未寫入 → 檢查點觸發 DBWN 寫入 → LGWR 等待 DBWN 完成。
  • 同時寫入 Group 2 對應修改塊。
  • LGWR 將觸發前 Log Buffer 所有內容 (含未提交 Redo) 寫入日誌檔。
  • 更新資料檔/控制檔頭 SCN。
  • **LGWR 等待的是 DBWN,非 CKPT 完成**。

五、實例恢復:前滾與回滾

斷電瞬間可能狀態:

#觸發條件類型
1Log Switch (日誌組切換)增量
2滿足 LOG_CHECKPOINT_TIMEOUT/INTERVAL、FAST_START_IO_TARGET/MTTR_TARGET增量
3ALTER SYSTEM SWITCH LOGFILE增量
4ALTER SYSTEM CHECKPOINT完全
5ALTER TABLESPACE ... BEGIN/END BACKUP增量
6ALTER TABLESPACE/DATAFILE OFFLINE增量
7正常關閉 (SHUTDOWN NORMAL/IMMEDIATE)完全
狀態RedoDatafile恢復動作
已 Commit、DBWN 未完成已寫入 (LGWR 同步)可能未寫SMON 從控制檔 Checkpoint RBA 前滾 Redo → 重做所有修改 (9i 前全重做,9i+ 過濾已寫塊)
未 Commit、執行中斷電部分寫入 (LGWR 批次寫入)可能部分寫入前滾同步 Redo/Datafile → 利用 Undo 重構最小 SCN 前映像回滾
未 Commit、久未 Commit可能已寫入 (LGWR 批次)可能已寫入 (DBWN 定期)前滾同步 → Undo 回滾 (LGWR/DBWN 大致同步)

六、恢復時間控制四參數

  • LOG_CHECKPOINT_INTERVAL:兩檢查點間 Redo 塊數。
  • LOG_CHECKPOINT_TIMEOUT:兩檢查點間秒數。
  • FAST_START_IO_TARGET:恢復需處理塊數上限。
  • FAST_START_MTTR_TARGET:直接設定目標恢復時間 (秒),Oracle 自動調整檢查點頻率。

七、增量檢查點優勢

CKPT 進程每 3 秒更新控制檔 Checkpoint RBA,實例失敗後**直接從最新 RBA 開始前滾**,省略大量 Redo 重做/過濾時間,大幅縮短 MTTR。

八、形象比喻

經營部 (LGWR) 記合同,貨運部 (DBWN) 按合同號送貨,監督部 (CKPT) 定期核對合同號與送貨進度。
增量檢查點 = 監督部每 3 秒記錄最新核對合同號。
人事大換血 (實例失敗) 後,新監督部從記錄本最新合同號繼續核對,無需從頭開始。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved