无备份的数据块损坏恢复办法 dbms_repair

如果是索引块出错,解决方案很简单,通过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/,如需转载,请注明出处,否则将追究法律责任。

Leave a Reply