坏块的解决办法

来源:互联网 发布:神通数据库 如何建表 编辑:程序博客网 时间:2024/04/28 18:18

写的比较片面目前 今天遇到坏块了 主要原因是重启数据库的时候用了shutdown abort造成,该块是是位于para_cell_w表上

解决方法是跳过这个坏块重建表,想到了用exp导出数据但发现会报错,所以用了两种方法 1.找到该坏块的最低的rowid,找到这个块的后一个块最低rowid 这样根据rowid把不在坏块上的数据搞出来建立表就可以了:

 

1 alter session set events='10231 trace name context forever,level 10';

  

    这个命令可以跳过坏块建表

 

   create table para_cell_w_bak as select * from para_cell_w;

 

 

2

      The "LOW_RID" is the lowest rowid INSIDE the corrupt block:

 

       SELECT dbms_rowid.rowid_create(1,<DATA_OBJECT_ID>,<RFN>,<BL>,0) LOW_RID from DUAL;

 

      The "HI_RID" is the first rowid AFTER the corrupt block:

 

       SELECT dbms_rowid.rowid_create(1,<DATA_OBJECT_ID>,<RFN>,<BL>+1,0) HI_RID  from DUAL;

   

It is now possible to use CREATE TABLE AS SELECT or INSERT ... SELECT
   to get data without accessing the corrupt block using a query of the
   form:

 

 CREATE TABLE salvage_table AS
 SELECT /*+ ROWID(A) */ * FROM <owner.tablename> A
 WHERE rowid < '<low_rid>'
 ;

 INSERT INTO salvage_table 
 SELECT /*+ ROWID(A) */ * FROM <owner.tablename> A
 WHERE rowid >= '<hi_rid>'

 

 

 

  SELECT dbms_rowid.rowid_create(1,'600613',20,648278,0) LOW_RID
  from DUAL;  

 AACSolAAUAACeRWAAA
  
   SELECT dbms_rowid.rowid_create(1,'600613',20,648279,0) HI_RID
  from DUAL; 

 AACSolAAUAACeRXAAA

 

 

即将导出指定的表通过常规路径...
. . 正在导出表                     PARA_CELL_W
EXP-00056: 遇到 ORACLE 错误 1578
ORA-01578: ORACLE 数据块损坏 (文件号 20, 块号 648278)
ORA-01110: 数据文件 20: '/oradata4/wcdma/WCDMA_DATA06.dbf'
导出成功终止, 但出现警告。

 

根据dba_objects查看obj_id