undo 坏块故障处理

1.查询数据库alert 日志

通过查看客户数据库节点1 alert日志发现object id为874720对象存在坏块。查询dba_objects视图找出object id为874720对应的数据库对象

undo 坏块故障处理_undo

根据object id为874720查出对应的表(FMIS1400.TRDATADETAIL2252),该表大小为3MB

问题原因

解决方案

1.关闭SMON回滚和10231跳过坏块导出表数据

由于数据库存在死事务,导致smon进程不断清理死事务,从而数据库实例1自动关闭。通过设置10513和10517事件,禁止数据库实例1的smon进程恢复死事务

SQL> alter system set events '10513 trace name context forever, level 2';

设置10231事件尝试跳过坏块,expdp导出表数据

SQL> alter system set events='10231 trace name context forever,level 10';

发现无法通过跳过坏块,导出数据。


2.尝试切换undo表空间

通过设置10513事件和10231事件,无法导出数据后,尝试新建一个undo表空间,并切换undo表空间至新建表空间。

SQL> create undo tablespace UNDOTBS3 datafile '+DATA/XXXX/datafile/undotbs03.dbf' size 1024M autoextend on next 10m maxsize unlimited;

SQL> alter system set undo_tablespace=UNDOTBS3 sid='xxxx';

SQL> drop tablespace UNDOTBS1 including contens;

在删除原有undo表空间 UNDOTBS1时,数据库报错undo表空间中_SYSSMU10_1201331463$段异常。

 

3.使用_offline_rollback_segments参数跳过undo表空间异常段

由于undo表空间_SYSSMU10_1201331463$段异常引起undo表空间坏块后,使用_offline_rollback_segments参数跳过该坏块

SQL>create pfile='/tmp/pfile.ora' from spfile;
    
在/tmp/file.ora文件中添加如下参数:

*._offline_rollback_segments=('_SYSSMU10_1201331463$')
    
使用/tmp/pfile.ora启动数据库

SQL>startup pfile='/tmp/pfile.ora';

执行删除undo表空间语句

SQL> drop tablespace UNDOTBS1 including contens;
    
此时成功删除UNDOTBS1表空间,并且成功查询FMSI1400用户TRDATADETAIL2252表数据, 
此时undo表空间坏块故常已成功解决,为防止该表存在的数据块隐藏其他问题,执行move table 和rebuild index操作,给该表迁移到新的数据块。

SQL>alter FMSI1400.TRDATADETAIL2252 move;

数据库实例2执行相同操作把数据库实例2原有UNDOTBS2切换成UNDOTBS4,故障解决。