1) 先取得坏块中ROW ID的最小值,执行以下的语句: SELECT dbms_rowid.rowid_create(1,,,,0) from DUAL;
2)取得坏块中的ROW ID的最大值,执行以下的语句: SELECT dbms_rowid.rowid_create(1,,,+1,0) from DUAL;
3)建立一个临时表存储那些没有坏块的数据,执行以下的语句: CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;
4)保存那些不存在坏块的数据到临时表中,执行以下的语句: INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A WHERE rowid < ''; INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A WHERE rowid >= '‘;
5) 根据临时表中的数据重建表,重建表上的索引,限制。 使用10231诊断事件,在做全表扫描的时候跳过坏块 可以在session级别设定: ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10'; 也可以在数据库级别上设定,在初始化参数中加入:event="10231 trace name context forever, level 10" ,然后重启数据库。 然后从存在坏块的表中取出不存在坏块的数据,执行以下的语句: CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table; 最后rename生成的corrupt_table为原来表的名字,并重建表上的索引和限制。 使用dbms_repair包进行恢复 使用dbms_repair标记有坏块的表,在做全表扫描的时候跳过坏块,执行以下的语句: Execute DBMS_REPAIR.SKip_CORRUPT_BLOCKS('',''); 然后使用eXP工具或者createtable as select的方法取出没有坏块数据,然后重建表,表上的索引和限制。 五:坏块的预先发现的方法