ora-01578问题的解决

来源:互联网 发布:日语汉字读音软件 编辑:程序博客网 时间:2024/04/30 20:22
今天同事反映一个报错:ORA-01578: ORACLE data block corrupted (file # 69, block # 129559)

ORA-01110: data file 69: '/data/XXXX/TS_CCBMMS_LOG_INDEX_20150201.dbf'

在告警日志alert.log中和应用程序日志中都能发现此报错。通过初步观察,是数据块损坏,损坏的应该是索引。可以通过以下语句来确认:

select * from dba_extents

where file_id='69'and'129559' between block_id and block_id+blocks -1;

发现损坏的是索引MMS_MOBILE_201502,再查出索引所属的表:

select * from  dba_indexes where index_name=upper('MMS_MOBILE_201502');

可以查到损坏的是索引MMS_MOBILE_201502,所属表为mms_logsend。


  1.将跟表mms_logsend相关的事务停止,做好备份,防止出错。

  create table mms_logsend_bak as select *from mms_logsend;

  2  删除索引MS_MOBILE_201502

  drop index MMS_MOBILE_201502;

  3  重新建立改索引

  create index MMS_MOBILE_201502 on MMS_LOGSEND (MOBILE) tablespace TS_CCBMMS_LOG_INDEX_201502;


问题解决。如果硬盘存在问题,还是建议尽快更换硬盘,防止以后有类似的问题出现。


附属网上摘录的ora-01578问题的解决方法:

 

这种问题的解决方法是很多的,如果你用的是归档方式,则可以基于时间点恢复来解决。不过这里介绍一种比较方便的解决方式,因为我的库没有开归档。Metaline关于ORA-01578的文字也很多,不过我看过后总觉得都不那么实用,不能解决实际的问题。

1、 解决这种问题的第一步是首先你要确定是什么段、哪个段坏了,是索引还是表?

A、 打开alter.log,找到ORA-01578的报错信息,并记录下file#block的值

B、 执行以下语句看哪个段坏了

  SQL>Select * from dba_extents

2  where  file_id=

3  and between block_id and block_id+blocks-1;

          这里的F指的是file#,B指的是block#

    2、如果确定下来坏的是索引段,这时你就可以轻舒一口气了,只要把这个索相删除然后重建一下就可以了,如果出现坏的是表段,则应往下走了。

     3 记录下这个表的建表语句

        A 以表的ownerpl/sql developer连入oracle

        B在左面的树状栏中找到这个表,右击该表->view->View SQL,记录下sql,以备以下步骤中重建索引

   4 实际处理

     A 以表的owner连入oracle

 B、 使用诊断事件10231

    SQL> ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level 10’;

C、创建一个临时表tmp的表中除坏块的数据都检索出来

SQL>CREATE TABLE tg_bill03_tmp as select * from tg_bill03;

C、 更名原表,并把tg_bill03_tmptg_bill03

SQL>alter table tg_bill03 rename to tg_bill03_bak;

SQL>alter table tg_bill03_tmp to tg_bill03;

D、tg_bill03上重新创建索引、约束、授权、trigger等对象

E、 利用表之间的业务关系,把坏块中的数据补足。




 
0 0