使用DBMS_REPAIR修复坏块(三)

2014-11-24 12:41:55 · 作者: · 浏览: 1
8 REPAIR_TABLE_NAME => 'REPAIR_TABLE',
9 ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
10 KEY_COUNT => num_orphans);
11 DBMS_OUTPUT.PUT_LINE('orphan key count: ' || TO_CHAR(num_orphans));
12 END;
13 /
orphan key count: 242
PL/SQL procedure successfully completed.
--下面的查询可以看到正好等于上面返回的数量也就是242条记录
sys@USBO> select count(*) from orphan_key_table;
COUNT(*)
----------
242
--验证对象是否可以查询,下面的结果显示依旧无法查询
sys@USBO> select count(*) from tb_obj;
select count(*) from tb_obj
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 131)
ORA-01110: data file 6: '/u02/database/usbo/oradata/tbs_tmp.dbf'
Step e 跳过坏块
--使用SKIP_CORRUPT_BLOCKS来告知Oracle哪些坏块需要被跳过
sys@USBO> BEGIN
2 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
3 SCHEMA_NAME => 'SYS',
4 OBJECT_NAME => 'TB_OBJ',
5 OBJECT_TYPE => dbms_repair.table_object,
6 FLAGS => dbms_repair.skip_flag);
7 END;
8 /
PL/SQL procedure successfully completed.
--由于索引键上存在孤立索引,因此我们重建索引
sys@USBO> alter index i_tb_obj rebuild;
Index altered.
--验证结果
sys@USBO> select count(*) from tb_obj;
COUNT(*)
----------
72211
5、后记
a、再次提醒,备份重于一切,因此无论何时应保留可用的备份。
b、DBMS_REPAIR包并不是真正意思上的坏块修复,而是标记坏块,损坏的这部分数据被丢失。
c、DBMS_REPAIR包的几个步骤,先创建相应的表用于存储修复表及孤立索引,其次CHECK_OBJECT,FIX_CORRUPT_BLOCKS,DUMP_ORPHAN_KEYS,SKIP_CORRUPT_BLOCKS。
d、完整DBMS_REPAIR上面提到的几个步骤后,建议重建索引。
e、注,如果受损表对象被其他对象参照,建议先disable这些约束,那些在子表上孤立的记录可根据情形决定后再enable约束。