ORA-00600
ORA-00600
ORA-600 错误是 Oracle 程序异常的通用内部错误编号,表示进程遇到了低级的意外情况。
其错误信息包括方括号中的参数列表:
ORA-00600: internal error code, arguments: [%s], [%s],[%s], [%s], [%s]
第一个参数是内部信息编号或字符串。根据该参数和数据库版本以确定根本原因,并根据错误跟踪中的调用堆栈信息查找解决方案。
诊断步骤:
- 检查告警日志及其指向的跟踪文件,重点为错误信息中的第一个参数。注意,如果设置了
MAX_DUMP_FILE_SIZE
参数,如果跟踪文件的大小超过了参数值,则文件会被截断,有可能无法找到错误原因。此时需要调整该参数重新生成完整的跟踪信息。 - 访问 My Oracle Support 的 ORA-00600 Lookup Tool (Note 153788.1),以查找相关文档。
- 如果参数为 12333, 729 或者 17059,上传跟踪文件到 ORA 600 Diagnostic Tool 以快速诊断。
对于由于系统掉电,存储故障等原因,导致重新启动数据库时出现 ORA-600 错误而无法打开数据库,一般步骤如下:
- 如果有备份,建议直接使用备份进行恢复,则无需进行下面的操作。
- 如果出现
ORA-00600: internal error code, arguments: [kccxxx]
,可能是控制文件出现了坏块或者不一致,这时候需要重建控制文件,否则无法继续恢复。 - 忽略不一致的 REDO LOG,强制打开数据库。
- 对于 10g 及其以上版本,在启动参数文件中添加:
_allow_error_simulation=TRUE
- 启动数据库到 MOUNT 状态:
startup mount pfile=xxxx
- 根据数据库版本调整 SCN,对于 11.2.0.2.6 及之前版本:
alter session set events '10015 trace name adjust_scn level 149';
,对于 11.2.0.2.6 之后版本,使用oradebug poke
调整 SCN,对于 12.2 版本,使用 EVENT 21307096 调整 SCN。 - 恢复数据库:
recover database using backup controlfile until cancel;
,完成后输入cancel
- 强制打开数据库:
alter database open resetlogs;
- 对于 10g 及其以上版本,在启动参数文件中添加:
- 如果数据库成功打开后又宕机,日志出现
ORA-00600: internal error code, arguments: [4193]
,这是由于 UNDO 记录和 REDO 中的记录不匹配导致,需要设置如下参数以正常打开数据库:
undo_management=manual
event='10513 trace name context forever, level 2'
event='10512 trace name context forever, level 1'
event='10511 trace name context forever, level 2'
event='10510 trace name context forever, level 1'
- 如果遇到
ORA-00600: internal error code, arguments: [4194]
,则是因为回滚段损坏导致,需要通过跟踪文件,找到出现故障的回滚段,然后在_offline_rollback_segments
或者_corrupt_rollback_segments
参数中指定这些回滚段,再尝试打开数据库。如果打开数据库后再次宕机,参考上一步的操作。 - 打开数据库后,导出数据到新的数据库中。
4194 4193 4197
APPLIES TO
Oracle Database - Enterprise Edition - Version 9.2.0.1 to 12.2.0.1 [Release 9.2 to 12.2]
SYMPTOMS
数据库宕机前,告警日志出现如下信息:
ORA-00600: internal error code, arguments: [4194], [#], [#], [], [], [], [], []
此错误表示检测到 REDO 和 UNDO 不匹配。
当向 UNDO 块中添加新的 UNDO 记录时,正常情况下,新记录的编号等于最大记录编号加一。添加新的 UNDO 记录前,如果 Oracle 验证失败,将触发 ORA-00600 [4194]。
CAUSE
这个问题一般发生在停电或硬件故障导致数据库崩溃时。启动时,数据库会进行正常的前滚(重做),然后回滚(撤销),此时就会产生该错误。
SOLUTION
最佳实践是创建新的 UNDO 表空间。
从 spfile
创建 pfile
:
create pfile='/tmp/initsid.ora' from spfile;
关闭数据库。
shutdown abort
在 pfile
中设置以下参数:
undo_management = manual
event = '10513 trace name context forever, level 2'
使用 pfile
启动数据库:
startup restrict pfile='/tmp/initsid.ora'
查询没有 OFFLINE
的 UNDO 段:
select tablespace_name, status, segment_name from dba_rollback_segs where status != 'OFFLINE';
如果有 UNDO 段的状态为 'PARTLY AVAILABLE' 或者 'NEEDS RECOVERY',则修改 pfile
,在 _offline_rollback_segments
或者 _corrupt_rollback_segments
参数中指定这些回滚段,再重启数据库。然后再次查询没有 OFFLINE
的 UNDO 段,如果都 OFFLINE
了才能进行下一步。
创建新的 UNDO 表空间:
create undo tablespace <new undo tablespace> datafile <datafile> size 2000M;
删除旧的 UNDO 表空间::
drop tablespace <old undo tablespace> including contents and datafiles;
关闭数据库:
shutdown immediate;
使用 spfile
启动数据库到 NOMOUNT:
startup nomount;
修改 spfile
中的 UNDO 表空间为新的 UNDO 表空间:
alter system set undo_tablespace = '<new undo tablespace>' scope=spfile;
关闭数据库:
shutdown immediate;
使用 spfile
启动数据库:
startup;
REFERENCES
NOTE:1428786.1 - Step by step to resolve ORA-600 4194 4193 4197 on database crash
REFERENCES
NOTE:1092832.1 - Primary Note for Diagnosing ORA-600