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

Oracle 空閒資料塊管理:Freelist vs Bitmap、段頭結構、DBWN 檢查點隊列寫入邏輯

     編輯:Oracle 資料庫基礎

資料塊空間管理有兩套機制:傳統 Freelist (鏈表) 與現代 Bitmap (位圖) (LMT + ASSM)。DBWN 依檢查點隊列順序寫入髒塊,保證恢復一致性。

一、Undo 儲存內容差異

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 寫完對應塊才繼續。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作Undo 記錄
DELETE整行資料 (前映像)
UPDATE被修改欄位的舊值
INSERT新行的 ROWID (刪除用)