日期:2014-05-16 浏览次数:20482 次
停电等意外关机会使oracle数据库出现bad回滚段,导致数据库无法启动。解决办法是去掉回滚段启动。 现象: startup时出现ORA-01092错误查看TRC日志文件,是ORA-00600错误。 ORA-00600: internal error code, arguments: [kteuPropTime-2], [], [], [], [], [], [], [] 由于ORACLE9.2.0.1里的BUG(BUG#: 2431450),使的SMON在工作过程中导致ORACLE实例crash,留下一个或多个bad的回滚段。当试图在宕掉的数据库重新startup时,SMON要进行事务恢复,从bad的回滚段里读取信息时失败,再次使ORACLE实例crash,从而数据库无法正常OPEN。二、解决步骤 1,首先要找出bad的回滚段。在初始化参数文件里增加下面2行 _smu_debug_mode=1 event="10015 trace name context forever, level 10" (_smu_debug_mode简单的收集诊断信息。Event 10015是回滚段恢复跟踪事件。)修改好参数文件后shutdown immediate数据库后,再startup数据库。此时数据库能mount,但仍然无法Open. 还会遇到ORA-01092错误。但这次ORACLE会把bad的回滚段信息写到跟踪文件里。udump 在跟踪文件里发现是_SYSSMU1$回滚段bad。 2,在初始化参数文件里去掉刚才增加的2行 _smu_debug_mode=1 event="10015 trace name context forever, level 10" 增加新的一行 _corrupted_rollback_segments=(_SYSSMU1$) 修改好参数文件后shutdown数据库,再startup数据库。此时数据库能OPen。 3,在SQLPLUS里登陆数据库 select segment_id,segment_name,tablespace_name,status from dba_rollback_segs where owner='PUBLIC'; SQL> / 1 _SYSSMU1$ UNDOTBS1 NEEDS RECOVERY 2 _SYSSMU2$ UNDOTBS1 ONLINE 3 _SYSSMU3$ UNDOTBS1 ONLINE 4 _SYSSMU4$ UNDOTBS1 ONLINE 5 _SYSSMU5$ UNDOTBS1 ONLINE 6 _SYSSMU6$ UNDOTBS1 ONLINE 7 _SYSSMU7$ UNDOTBS1 ONLINE 8 _SYSSMU8$ UNDOTBS1 ONLINE 9 _SYSSMU9$ UNDOTBS1 ONLINE 10 _SYSSMU10$ UNDOTBS1 ONLINE 10 rows selected. 果然是_SYSSMU1$回滚段的状态是‘NEEDS RECOVERY’。其它9个回滚段是ONLINE的。此时数据库已经能够正常使用,不过SMON会每隔5分钟写一条日志信息: SMON:about to recover undo segment 1 SMON: mark undo segment 1 as needs recovery 4,删除bad的回滚段在SQLPLUS里 drop rollback segment "_SYSSMU1$"; 5,再修改修改好参数文件,去掉 _corrupted_rollback_segments=(_SYSSMU1$) 这一行,然后shutdown,再startup。这样数据库又恢复了正常。