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

Oracle DML 執行全流程拆解:從解析、Undo 記錄、Redo 生成到提交與崩潰恢復機制

     編輯:Oracle 資料庫基礎

背景

Oracle 9i 引入自動 Undo 管理(AUM),取代手工管理(MUM)。本文以 UPDATE tab SET col1='A' WHERE col1='B' 為例,詳細追蹤 DML 從發起到提交的內部步驟。

執行步驟詳解

  1. Shared Pool 解析:生成執行計劃。
  2. 定位數據塊:假設目標行在 10 號文件 54 號塊。
  3. 獲取 Undo 塊:在 Buffer Cache 找可用 Undo 塊(如 11 號文件 24 號塊),無則從 Undo 表空間讀入。
  4. 記錄前映像:將舊值 'B' 寫入 Undo 塊。
  5. 生成 Redo 記錄 #120:記錄 Undo 塊變更(事務 T1、文件 11、塊 24、行 10、列 col1、值 B)。
  6. 讀入目標數據塊:將 54 號塊讀入 Buffer Cache(無則從 10 號文件讀入)。
  7. 修改數據塊:將新值 'A' 寫入 54 號塊。
  8. 生成 Redo 記錄 #121:記錄數據塊變更(事務 T1、文件 10、塊 54、行 10、列 col1、值 A)。
  9. 控制權返回用戶:SQL*Plus 顯示游標返回。
  10. 用戶發出 COMMIT:
    • 觸發 LGWR 將 Redo #120、#121 寫入聯機日志文件。
    • 將 54 號數據塊與 24 號 Undo 塊頭事務狀態標記為「已提交」。
    • 控制權返回用戶。
  11. DBWn 延遲寫入:髒塊不一定立即寫入數據文件,僅當髒塊達閾值時刷盤。提交後 Undo 塊可被覆蓋。

崩潰恢復原理

前滾

實例重啟,SMON 根據 Redo Log 重放已提交事務的修改(即使數據塊未寫入磁盤)。

回滾

未提交事務的修改(已被 DBWn 寫入磁盤)通過 Redo Log 中的 Undo 信息還原。

Checkpoint 決定恢復時間

四個參數控制 Checkpoint 頻率:

  • log_checkpoint_interval:Redo Block 數
  • log_checkpoint_timeout:秒數(默認 1800s)
  • fast_start_io_target:恢復需處理塊數
  • fast_start_mttr_target:目標恢復時間(默認 0 無限制)

Undo 記錄內容差異

  • DELETE:記錄整行數據
  • UPDATE:僅記錄被修改列的舊值
  • INSERT:記錄 RowID

用戶 ROLLBACK 時,根據操作類型反向應用 Undo 記錄。

總結

DML 執行過程中,Undo 與 Redo 緊密協作:Undo 保障事務隔離與回滾,Redo 保障持久化與崩潰恢復。理解這一流程是調優事務吞吐、排查鎖競爭、制定備份恢復策略的關鍵。

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