接續前文,本文深入剖析 Oracle 11g 歸檔日誌(Redo Log)從第 3 塊開始的數據塊結構,詳細闡述塊頭、塊體、記錄頭、Change Vector 及數據載荷的層層嵌套關係,為日誌挖掘、數據恢復、遷移工具開發提供底層結構參考。
每個塊固定 512 字節,僅包含塊頭(16 字節)與塊體(496 字節):
typedef struct bk {
Redo_bh blockhead; // 16 字節塊頭
uint8_t buf[496]; // 496 字節塊體,存放操作記錄
} Redo_bk;
typedef struct bh {
uint32_t signature; // 簽名標識
uint32_t blocknum; // 塊號(序號)
uint32_t sequence; // 順序號
uint16_t offset; // 首記錄偏移(高位標誌需掩碼 0x7FFF)
uint16_t checksum; // 校驗和
} Redo_bh;
offset 字段語義(小端序存儲):
0:塊中無新記錄起始(可能為空塊或完全被上一塊跨塊記錄佔用)。>= 0x10 (16):首記錄起始位置(含塊頭)。最大理論值約 472(512-16-最小記錄頭 24)。塊體按 offset 串聯起來形成完整邏輯記錄,單條記錄包含:
當單條記錄超過塊體剩餘空間時,會自動跨塊延續。解析器需根據 offset 與記錄頭長度字段,跨塊拼接完整記錄。
Oracle Redo 結構雖複雜,但其設計精妙地平衡了寫入性能(順序追加)、恢復完整性(SCN 有序)與存儲效率(塊級管理)。深入理解其塊與記錄層級結構,是構建高階數據庫工具的基石。