1.确认坏块部分是表还是索引
SELECT owner,segment_name,segment_type,block_id
FROM dba_extents
WHERE block_id <= &block_id
AND block_id + blocks -1 > &block_id
AND file_id = &file_id;
1.1 如果是索引,rebuild 即可
1.2 如果是表
1)有rman备份
rman>blockrecover datafile file# block block#
2) 把受损数据块标记成"software corrupt",oracle在扫描时跳过这些块,然后通过CTAS方法把数据抢救出来
a)把数据块标记成"corrupt"
如果遇到ORA-1578错误,说明数据块已经被标识为"software corrupt";
如果遇到ORA-600,就需要使用DBMS_REPAIR包把数据块标识成"software corrupt",这时再扫描到这个数据块时会抛出ORA-1578错误
b)扫描是跳过"software corrupt"数据块
可以使用dbms_repair.skip_corrupt_blocks跳过坏块
或者使用10231事件
可以从视图dba_tables.skip_corrupt字段可以看出表是否设置了这个标志
如果使用CTAS方法重建表,最好是在session、实例级别设置10231事件
如果通过exp方式重建表,则需要在实例级别设置或者使用dbms_repair包
可以参照如下步骤:
A、 使用诊断事件 10231,跳过坏块检查
SQL> ALTER SESSION SET EVENTS '10231 trace name context forever,level 10';
B 、创建一个临时表 tab_tmp 的表中除坏块的数据都检索出来
SQL>CREATE TABLE tab_tmp as select * from tab;
SQL>ALTER SESSION SET EVENTS '10231 trace name context off';
C、 更名原表,并把 tab_tmp 更名为 tab
SQL>alter table tab rename to tab_bak;
SQ