本文示範如何在 Oracle 10g/11g 中導出索引樹結構與葉區塊內容,並解析 Rowid 與索引鍵值編碼。
ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME TREEDUMP LEVEL 95503';
95503 為索引 OBJECT_ID (可從 DBA_OBJECTS 查詢)。追蹤檔位於 USER_DUMP_DEST。
branch: 0x100150c 16782604 (0: nrow: 178, level: 1) leaf: 0x100150d 16782605 (-1: nrow: 288 rrow: 288) leaf: 0x100150e 16782606 (0: nrow: 289 rrow: 289) leaf: 0x100150f 16782607 (1: nrow: 288 rrow: 288) ...
0x100150f = 區塊 DBA (十六進位)16782607 = 區塊 DBA (十進位)nrow = 區塊總記錄數,rrow = 有效記錄數-- 將十六進位 DBA 轉檔號/區塊號
VAR file# NUMBER; VAR block# NUMBER;
EXEC :file# := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(TO_NUMBER('100150F','XXXXXXXX'));
EXEC :block# := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('100150F','XXXXXXXX'));
PRINT file#; -- 4
PRINT block#; -- 5391
-- 導出區塊
ALTER SYSTEM DUMP DATAFILE 4 BLOCK 5391;
Leaf block dump kdxconro 288 -- 記錄數 row#0[8013] flag: ------, lock: 0, len=23 col 0; len 5; (5): 31 30 36 31 31 -- 索引鍵值1 (VARCHAR2) '10611' col 1; len 7; (7): 78 73 04 08 0f 3c 19 -- 索引鍵值2 (DATE) 2015-04-08 14:59:24 col 2; len 6; (6): 01 00 14 26 01 66 -- Rowid (十六進位)
01 00 14 26 01 66 → 二進位:00000001 00000000 00010100 00100110 00000001 01100110 → 檔號 (前 10 bits) = 4 → 區塊號 (中 22 bits) = 5158 → 行號 (後 16 bits) = 358
-- VARCHAR2
SELECT UTL_RAW.CAST_TO_VARCHAR2('3130363131') FROM DUAL; -- '10611'
-- DATE (需自訂函數 f_get_from_dump)
SELECT f_get_from_dump('78,73,04,08,0F,3C,19','DATE') FROM DUAL; -- 2015-04-08 14:59:24
DELETE 後標記刪除旗標 (kdxlende)