Oracle數據塊完整結構:
數據塊(8KB標準大小)
├─ 塊頭部(Block Header)
│ ├─ 塊元信息
│ │ ├─ 數據塊地址(DBA)
│ │ ├─ 塊類型(數據塊/索引塊/段頭塊等)
│ │ └─ 塊校驗和
│ ├─ SCN(塊最後一次修改時的SCN)
│ ├─ ITL列表(事務槽列表)
│ │ ├─ ITL Entry 0
│ │ │ ├─ XID(事務ID:USN+SLOT+SEQ)
│ │ │ ├─ UBA(Undo塊地址)
│ │ │ ├─ SCN(提交SCN/0xffff)
│ │ │ ├─ FLAG(事務狀態)
│ │ │ ├─ LCK(行鎖計數器)
│ │ │ └─ SCN_WRAP(SCN高位擴展)
│ │ └─ ITL Entry 1...n
│ └─ 行目錄(Row Directory)
├─ 數據行區
│ ├─ 行記錄 0
│ │ ├─ 行頭(3字節)
│ │ │ ├─ Lock Byte
│ │ │ │ ├─ 鎖類型(1bit)
│ │ │ │ └─ ITL索引號(7bit)
│ │ │ ├─ 行標記(刪除/遷移/鏈式)
│ │ │ └─ 列數
│ │ └─ 列數據
│ └─ 行記錄 1...n
└─ 空閒空間
├─ 空閒空間起始偏移
└─ 空閒空間大小
Undo塊關聯結構:
Undo Block
├─ Undo Header
│ ├─ 回滾段號
│ ├─ 事務狀態
│ └─ 提交SCN(事務提交時寫入)
└─ Undo Records
├─ Record Header
│ ├─ UBA(當前記錄地址)
│ ├─ Prev UBA(前驅記錄)
│ ├─ SCN(修改SCN)
│ ├─ Object ID(對象ID)
│ └─ RowID(被修改行地址)
└─ 前鏡像數據
讀一致性工作流程:
查詢開始時獲取系統當前SCN(scn1)
訪問數據塊時比較塊頭SCN(scn2):
若 scn1 >= scn2:直接讀取當前數據
若 scn1 < scn2:觸發一致性讀
一致性讀流程:
a. 逐行檢查數據行
b. 通過行頭Lock Byte中的ITL索引定位事務槽
c. 根據事務槽UBA找到undo鏈首記錄
d. 遍歷undo記錄鏈(通過Prev UBA):
- 比較每條undo記錄的SCN(scn3)與scn1
- 找到滿足 scn3 <= scn1 的最新undo記錄
e. 從undo記錄中獲取前鏡像數據
關鍵設計特點:
空間效率:ITL固定大小(24字節/槽),行頭僅3字節
鎖分離存儲:行頭存ITL索引,事務槽存鎖計數器
版本鏈回溯:通過UBA→Prev UBA形成undo記錄鏈表
SN機制:SCN_WRAP擴展支持大事務量場景
該結構解釋與您文檔中的錯誤日誌(ORA-7445)相關,當發生內存拷貝異常時,可能是在遍歷這些結構時發生指針錯誤。