SELECT tablespace_name, segment_type, owner, segment_name, partition_name FROM dba_extents WHERE file_id = and between block_id AND block_id + blocks – 1;
(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的方法取出没有坏块数据,然后重建表,表上的索引和限制。 坏块的预先发现的方法