一例ORA-01578、ORA-01110错误
Oct262016
在检查一个客户数据库告警日志的时候,发现大量的ORA-1578错误,这个错误通常和坏块有关,错误信息如下:
Tue Oct 25 14:31:54 2016 ORA-1578 encountered when generating server alert SMG-4121 Tue Oct 25 14:36:54 2016 DDE: Problem Key 'ORA 1578' was completely flood controlled (0x6) Further messages for this problem key will be suppressed for up to 10 minutes ORA-1578 encountered when generating server alert SMG-4121
大量联系的这个错误,并没有提示是具体的原因,一直向前查看告警日志,发现ORA-0158和ORA-01110错误,这才是错误的真正原因。
Sun Oct 23 08:30:01 2016 Errors in file /opt/oracle/diag/rdbms/yiliao/YILIAO/trace/YILIAO_mmon_2517.trc (incident=139835): ORA-01578: ORACLE data block corrupted (file # 2, block # 3548) ORA-01110: data file 2: '/opt/oracle/oradata/YILIAO/sysaux01.dbf' Errors in file /opt/oracle/diag/rdbms/yiliao/YILIAO/trace/YILIAO_mmon_2517.trc (incident=139836): ORA-01578: ORACLE data block corrupted (file # 2, block # 3548) ORA-01110: data file 2: '/opt/oracle/oradata/YILIAO/sysaux01.dbf' ORA-1578 encountered when generating server alert SMG-4121
错误提示,第二号数据文件的第3548号数据块损坏,而且损坏的是SYSAUX辅助表空间的数据块,辅助表空间损坏或者数据文件丢失,通常并不会影响数据库的正常运行,但最好还是处理一下。以下是解决思路和方法。
首先,需要查询到,损坏的数据块上存放的是哪个对象,是索引还是表,索引重建即可解决,表相对麻烦,不幸的是,损坏的数据块,存放的是WRI$_ALERT_OUTSTANDING表的数据。
SQL> SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, A.PARTITION_NAME FROM DBA_EXTENTS A WHERE FILE_ID = 2 AND 3548 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1; OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME PARTITION_NAME ------ ---------------------- ------------- --------------- -------------- SYS WRI$_ALERT_OUTSTANDING TABLE SYSAUX
WRI$_ALERT_OUTSTANDING表存放的是一些数据库的错误信息,通常不会有太多的数据量,经查看,这张表并没有数据。
SQL> select count(*) from WRI$_ALERT_OUTSTANDING; COUNT(*) ---------- 0
很幸运,这张表没有数据,解决起来就简单多了,最起码重建表的方法即可解决,我使用的是TRUNCATE该表的方法,解决的这个问题,TRUNCATE表,会对表分配的段进行重新初始化操作,刚好可以解决这个问题。
SQL> truncate table WRI$_ALERT_OUTSTANDING; Table truncated.
TRUNCATE该表后,通过一天的观察,再未遇到ORA-01578错误。