undo 坏块故障处理
1.查询数据库alert 日志
通过查看客户数据库节点1 alert日志发现object id为874720对象存在坏块。查询dba_objects视图找出object id为874720对应的数据库对象
根据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,故障解决。