資料塊空間管理有兩套機制:傳統 Freelist (鏈表) 與現代 Bitmap (位圖) (LMT + ASSM)。DBWN 依檢查點隊列順序寫入髒塊,保證恢復一致性。
一、Undo 儲存內容差異
| 操作 | Undo 記錄 |
| DELETE | 整行資料 (前映像) |
| UPDATE | 被修改欄位的舊值 |
| INSERT | 新行的 ROWID (刪除用) |
Commit → Undo 標記 Committed;Rollback → 依 Undo 還原 (Delete 寫回、Update 回舊值、Insert 刪除)。
二、檢查點與 SCN 寫入規則
- Checkpoint:觸發 LGWR/DBWN 寫 SCN 到塊頭、控制檔、資料檔頭。
- 用戶 DML/Commit:僅寫 SCN/Commit SCN 到塊頭,**不更新控制檔/資料檔頭 SCN**。
- SMON 前滾:從控制檔
Checkpoint SCN 開始;回滾:回滾所有未標記 Committed 的 Undo 塊。
三、空閒塊管理:Freelist (手動/字典管理)
- 段頭塊存指向第一自由塊指標 → 單向鏈表。
FREELISTS=N → N 條獨立鏈表,段頭存 N 指標。
- 運作:建段時初始區塊 (除段頭) 全入鏈表;擴展區 → 全區塊入鏈表。
- 塊使用率 >
100-PCTFREE → Unlink (短路);使用率 < PCTUSED → Relink 到表頭。
- INSERT 必須鎖定 Freelist 取塊 → 多重 INSERT 產生 Freelist Latch 爭用。
- UPDATE/DELETE 不經 Freelist,走 Lock 佇列 + ITL (Interested Transaction List)。
四、空閒塊管理:Bitmap (LMT + ASSM)
- 段頭區儲存三層 Bitmap 區塊:
Level 1:管理區內所有塊狀態 (Metadata、75-100% free、50-75%、25-50%、0-25%、Full、Unformatted)。
Level 2:列舉 Level 1 區塊清單。
Level 3 (Page Table Segment Header):記錄 Level 2 清單、各區起始塊、區塊數、資料起始位址。
- 大區可能有多個 Level 1;小區 Level 1 可跨區管理。
- 自動管理、無參數調優、RAC 友善。
五、DBWN 寫入順序:檢查點隊列
- 8i 引入 Buffer Checkpoint Queue:依塊**首次被修改時間 (Low RBA)** 遞增串聯。
- 塊首次修改 → 記錄 Redo 位置
Low RBA 到塊頭;後續修改更新 High RBA。
- 未修改塊無 RBA,不入隊列。
- 無檢查點時:DBWR 依 Low RBA 升序寫髒塊 → 寫完斷開隊列。
- 檢查點發生:CKPT 每 3 秒記錄隊列最小 Low RBA 到控制檔
Checkpoint RBA。
DBWN 寫至隊列首塊 Low RBA > Checkpoint RBA 即停止 → 完成增量檢查點。
- 日誌切換觸發檢查點:LGWR 等待 DBWN 寫完對應塊才繼續。
- 上一篇文章: Oracle Latch 與 Lock 機制深度解析:保護記憶體 vs 保護資料、死鎖與讀一致性
- 下一篇文章: Oracle COMMIT 內部機制全解析:LGWR/DBWN 協作、檢查點類型、實例恢復前滾回滾邏輯
Copyright ©
程式碼之家 All Rights Reserved