無備份的資料塊損壞恢復辦法 dbms_repair

myownstars發表於2011-07-29

如果是索引塊出錯,解決方案很簡單,透過online重建索引即可(必須加online,否則會依據出錯的索引來重建),也可採用先刪除再重建的方法;

如果是表塊出錯,步驟複雜一點,首先要把受損的塊查詢出來,讓oracle掃描表時跳過這些壞塊;然後透過CTAS方式恢復剩餘資料;最後需要藉助第三方工具修復壞塊資料。

 

 

如何判斷資料塊是否被標示?

掃描遇到ORA-1578,說明資料塊已經為software corrupt;如遇到ORA-600,則需要使用dbms_repair,再次掃描該塊時會報ORA-1578

如何再掃描時跳過software corrupt資料塊?

呼叫dbms_repair.skip_corrupt_blocks;呼叫10231事件,alter session/system set events ‘10231 trace name context forever, level n’;

 

具體步驟

需要先呼叫dbms_repair.admin_tables建立兩個表,一個是repair table,第二個是orphan key table

Exec dbms_repair.admin_tables(table_name => ‘repair_table’,table_type => dbms_repair.repair_table,action => dbms_repair.create_action, tablespace => ‘USERS’);

Exec dbms_repair.admin_tables(table_type => dbms_repair.orphan_table,action => dbms_repair.create_action, tablespace => ‘USERS’);

接著檢查出現壞塊的表

Exec dbms_repair.check_object(schema_name => ‘JUSTIN’, object_name => ‘TEST’, repair_table_name => ‘REPAIR_TABLE’, corrupt_count => :count);

然後打標示

Exec dbms_repair.fix_corrupt_blocks(schema_name => ‘JUSTIN’, object_name => ‘TEST’, object_type => dbms_repair.table_object, repair_table_name => ‘REPAIR_TABLE’, fix_count => :count);

以後掃描該表會跳過壞塊

Exec dbms_repair.skip_corrupt_blocksd(schema_name => ‘JUSTIN’, object_name => ‘TEST’, object_type => dbms_repair.table_object, flags=> dbms_repair.skip_flag);

此時可以透過CTAS方式重建表,如果想要原表修復,則需要重建物件的freelist,防止這個資料塊以後被加到freelist

Exec dbms_repair.rebuild_freelists(schema_name => ‘JUSTIN’, object_name => ‘TEST’, object_type => dbms_repair.table_object);

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-703504/,如需轉載,請註明出處,否則將追究法律責任。

相關文章