保存在Oracle數據文件頭中的信息很豐富,通常只要查詢DATAFILE_HEADER視圖就可以獲得數據文件頭中的信息。但其在數據文件頭中的具體位置,Oracle一直未公開過。所幸的是DBA們對數據文件頭的研究孜孜不倦,其研究成果在網上也是隨處可見。雖然這部分信息在數據庫日常運維過程中幾乎不會用到。但在災難挽救中,如果掌握了這部分信息,往往能夠讓數據庫起死回生。本節根據筆者這些年的災難挽救經驗,著重介紹了保存在數據文件頭中和災難挽救相關的知識點,希望讀者能夠好好掌握,多做實驗。以下中的DUMP信息來自Oracle 10.2.0.5 for Linux。不同的數據庫版本和操作系統,標記位的位置可能會不同。
表6-2 數據文件頭中的標記位及含義
標記位 在數據文件頭中的位置 含義
ub1 type_kcbh @0 塊類型。0x0b表示數據文件頭的塊類型,0x06表示數據塊類型
ub1 frmt_kcbh @1 數據塊大小為2kB時為0x62,4kB時為0x82,8kB時為0xa2,16kB時為0xc2。Oracle 8i-9i都是0x02
ub4 rdba_kcbh @4 數據文件頭的DBA地址
ub4 bas_kcbh @8 數據塊的SCN低4字節值,在數據文件頭中為空
ub2 wrp_kcbh @12 數據塊的SCN高2字節值,在數據文件頭中為空
ub1 seq_kcbh @14 表示數據塊在同一個SCN中的變化次數。
0xff值表示Oracle將其標記為壞塊。在某些故障處理過程中我們需將其修改為0x01值
ub1 flg_kcbh @15 數據塊的CHECKSUM值,一般為0x04值。表示該計算值已經保存在數據塊中。0x02值表示該塊為延遲塊清理。0x06表示是以上兩種情況的組合。0x01值表示該塊為原始數據塊。在某些故障處理過程中我們需將其修改為0x04值
ub2 chkval_kcbh @16 數據塊的校驗值,編輯數據塊之后必須要用bbed工具命令sum apply重新計算該校驗值
ub4 kccfhdbi @28 數據庫的DBID值,一般建議用nid工具修改,由于DBID還存儲于控制文件和日志文件中,所以修改DBID之后需要重建控制文件并用resetlogs選項打開數據庫
ub4 kccfhcsq @40 控制文件的sequence,在備份恢復中可能需修改該值
ub4 kccfhfsz @44 數據文件的大小,該值和保存在操作系統頭中的數據文件大小一致,其值不包含操作系統頭
s_blkz kccfhbsz @48 數據文件的塊大小
ub2 kccfhfno @52 數據文件號
ub4 kscnbas @100 數據文件的CREATION SCN低4字節值
ub2 kscnwrp @104 數據文件的CREATION SCN高2字節值
ub4 kcvfhrlc @112 數據文件的RESETLOGS COUNT
ub4 kscnbas @116 數據文件的RESETLOGS SCN低4字節值
ub2 kscnwrp @120 數據文件的RESETLOGS SCN高2字節值,在某些情況下我們需要用bbed修改數據文件的RESETLOGS COUNT和RESETLOGS CHANGE,以使它們和其他數據文件保持一致
ub4 kscnbas @128 數據文件的BACKUP SCN的低4字節值
ub2 kscnwrp @132 數據文件的BACKUP SCN的高2字節值,和V$BACKUP視圖中CHANGE#字段保持一致
ub2 kcvfhsta @138 FUZZY標記,0x0004表示為YES,即數據文件中的數據塊SCN有可能大于數據文件頭SCN。0x0000表示fuzzy為NO,即數據庫正常關閉或者改數據文件所在表空間處于read only狀態。當數據庫無法OPEN時,有時需要將其修改為0x0000,system數據文件為0x2000
ub4 kcvfhcpc @140 數據文件的CHECKPOINT COUNT。如果數據庫無法OPEN,有時需要使其和其他數據文件保持一致
ub4 kcvfhccc @148 控制文件的 CHECKPOINT COUNT。如果數據庫無法OPEN或處理恢復故障,有時需要使其和其他數據文件保持一致。
ub4 kcvfhprc @416 數據文件的PREV RESETLOGS COUNT
ub4 kscnbas @420 數據文件的PREV RESETLOGS SCN低4字節值
ub2 kscnwrp @424 數據文件的PREV RESETLOGS SCN高2字節值
ub4 kscnbas @484 數據文件頭的SCN低4字節值
ub2 kscnwrp @488 數據文件頭的SCN高2字節值,這是數據文件頭中最重要的SCN,如果數據庫無法OPEN,有時需要使其和其他數據文件保持一致,或者手動將其增大。Oracle 9i的數據文件頭SCN位于offset @140之后的6個字節處
ub2 kcvcpthr @496 數據文件當前寫的REDOLOG THREAD號
ub4 kcrbaseq @500 數據文件當前寫的REDOLOG SEQUENCE。在處理恢復故障時,有時需要使其和其他數據文件保持一致
ub4 kcrbabno @504 數據文件當前寫的REDOLOG的BLOCK號。數據庫無法OPEN時,有時需要將其置為0或者修改成和其他數據文件一致的值
ub2 kcrbabof @508 數據文件當前寫的REDLOG BLOCK中的偏移量,數據庫無法OPEN時,有時需要將其置為0或者修改成和其他數據文件一致的值