背景
Oracle 9i 引入自動 Undo 管理(AUM),取代手工管理(MUM)。本文以 UPDATE tab SET col1='A' WHERE col1='B' 為例,詳細追蹤 DML 從發起到提交的內部步驟。
執行步驟詳解
- Shared Pool 解析:生成執行計劃。
- 定位數據塊:假設目標行在 10 號文件 54 號塊。
- 獲取 Undo 塊:在 Buffer Cache 找可用 Undo 塊(如 11 號文件 24 號塊),無則從 Undo 表空間讀入。
- 記錄前映像:將舊值 'B' 寫入 Undo 塊。
- 生成 Redo 記錄 #120:記錄 Undo 塊變更(事務 T1、文件 11、塊 24、行 10、列 col1、值 B)。
- 讀入目標數據塊:將 54 號塊讀入 Buffer Cache(無則從 10 號文件讀入)。
- 修改數據塊:將新值 'A' 寫入 54 號塊。
- 生成 Redo 記錄 #121:記錄數據塊變更(事務 T1、文件 10、塊 54、行 10、列 col1、值 A)。
- 控制權返回用戶:SQL*Plus 顯示游標返回。
- 用戶發出 COMMIT:
- 觸發 LGWR 將 Redo #120、#121 寫入聯機日志文件。
- 將 54 號數據塊與 24 號 Undo 塊頭事務狀態標記為「已提交」。
- 控制權返回用戶。
- 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 保障持久化與崩潰恢復。理解這一流程是調優事務吞吐、排查鎖競爭、制定備份恢復策略的關鍵。