如果数据库启动不了,在 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>';


再次重启,如果可以成功,那么赶紧做一次全备份吧。