如果数据库启动不了,在 alert log 中发现了 ORA-00600[4194] 错误,表明 UNDO 和 REDO 中记录的 undo 记录不一致。此时,需要尝试重新建立新的 UNDO,我们需要找到老的 UNDO,把它 变成 offline, 然后建立新的 UNDO,再重新启动。
具体作法是:
创建 PFILE, 例如:
create pfile='/tmp/mypfile.ora' from spfile;
手工修改pfile, 改 undo 管理为 manual 方式。
undo_management = manual
设置 event 10513, 使得 undo segment 变成 offline。
event = '10513 trace name context forever, level 2'
关于 10513 event,设置后可以观察到设置前后 undo segment 的变化:
设置前:
SQL> select tablespace_name, status, segment_name from dba_rollback_segs where status != 'OFFLINE'; TABLESPACE_NAME STATUS SEGMENT_NAME ------------------------------ ---------------- ------------------------------ SYSTEM ONLINE SYSTEM UNDOTBS1 ONLINE _SYSSMU1_3724004606$ UNDOTBS1 ONLINE _SYSSMU2_2996391332$ UNDOTBS1 ONLINE _SYSSMU3_1723003836$ UNDOTBS1 ONLINE _SYSSMU4_1254879796$ UNDOTBS1 ONLINE _SYSSMU5_898567397$ UNDOTBS1 ONLINE _SYSSMU6_1263032392$ UNDOTBS1 ONLINE _SYSSMU7_2070203016$ UNDOTBS1 ONLINE _SYSSMU8_517538920$ UNDOTBS1 ONLINE _SYSSMU9_1650507775$ UNDOTBS1 ONLINE _SYSSMU10_1197734989$ 11 rows selected.
设置后:
SQL> select tablespace_name, status, segment_name from dba_rollback_segs; TABLESPACE_NAME STATUS SEGMENT_NAME ------------------------------ ---------------- ------------------------------ SYSTEM ONLINE SYSTEM UNDOTBS1 OFFLINE _SYSSMU10_1197734989$ UNDOTBS1 OFFLINE _SYSSMU9_1650507775$ UNDOTBS1 OFFLINE _SYSSMU8_517538920$ UNDOTBS1 OFFLINE _SYSSMU7_2070203016$ UNDOTBS1 OFFLINE _SYSSMU6_1263032392$ UNDOTBS1 OFFLINE _SYSSMU5_898567397$ UNDOTBS1 OFFLINE _SYSSMU4_1254879796$ UNDOTBS1 OFFLINE _SYSSMU3_1723003836$ UNDOTBS1 OFFLINE _SYSSMU2_2996391332$ UNDOTBS1 OFFLINE _SYSSMU1_3724004606$ 11 rows selected.
以 restrict 方式,用刚才修改的 pfile 启动:
startup restrict pfile='/tmp/mypifle.ora'
此时,查询 dba_rollback_segs,会发现除了 system 之外,其他的 UNDO 段,都已经是 offline 了。这说明还有救。这时可以创建新的 UNDO 表空间:
SQL>create undo tablespace ...
删除旧的 UNDO 表空间:
SQL> drop tablespace ...
重新启动,并设定数据库使用新的 UNDO 表空间:
SQL>shu immediate SQL>sartup nomount SQL>alter system set undo_tablespace ='<新UNDO>';
再次重启,如果可以成功,那么赶紧做一次全备份吧。