7月1日, 客户告知我,一个数据库打不开了,他的描述是控制文件丢失
登录主机,尝试启动, 在告警日志中出现了如下错误:
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_7456.trc (incident=26610):
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [46799], [18672], [19063], [], [], [], [], [], [], []
Incident details in: e:\app\administrator\diag\rdbms\orcl\orcl\incident\incdir_26610\orcl_ora_7456_i26610.trc
Aborting crash recovery due to error 600
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_7456.trc:
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [46799], [18672], [19063], [], [], [], [], [], [], []
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_7456.trc:
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [46799], [18672], [19063], [], [], [], [], [], [], []
此错误是说,数据库需要恢复rba至19063, 但是因为某种原因,只能利用sequence#为46799的redo log恢复至18672, 从而出错。
解决的方法是重建控制文件并recover database。
操作之前,最好先备份原来的数据文件,redo与控制文件。 首先尝试了用resetlogs选项重建控制文件,数据库不能打开。最后报错:
Database Characterset is ZHS16GBK
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_smon_6528.trc (incident=28964):
ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], []
Incident details in: e:\app\administrator\diag\rdbms\orcl\orcl\incident\incdir_28964\orcl_smon_6528_i28964.trc
Doing block recovery for file 3 block 174711
Resuming block recovery (PMON) for file 3 block 174711
Block recovery from logseq 46800, block 104 to scn 125738712
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_8284.trc (incident=29016):
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
启动数据库至nomount, 执行以下脚本
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 4672
LOGFILE
GROUP 1 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 2 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 3 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF',
'E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF',
'E:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF',
'E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF',
'E:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF',
CHARACTER SET ZHS16GBK
并执行recover database, 数据库可以打开,但是出现了新的问题, 打开之后直接抛错, 实例中止.
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_6184.trc (incident=30226):
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
ORA-01092: ORACLE 实例终止。强制断开连接
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [4194], [], [], [], [], [], [], [], [], [], [], []
这里是数据库的UNDO段出现了问题,需要通过将UNDO_MANAGEMENT设置为manual, 如下:
*.undo_management='MANUAL'
*.undo_tablespace='UNDOTBS1'
创建pfile, 修改之后,可以打开数据库.此时, 数据库告警日志中出现坏块的告警:
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_mmon_4624.trc (incident=32607):
ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], []
Incident details in: e:\app\administrator\diag\rdbms\orcl\orcl\incident\incdir_32607\orcl_mmon_4624_i32607.trc
Errors in file e:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_smon_1528.trc (incident=32592):
ORA-01578: ORACLE data block corrupted (file # 2, block # 2)
ORA-01110: data file 2: 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF'
此后将需要的业务数据通过exp导出, 并重建数据库, 问题最终解决
Best practice to create a new undo tablespace.
This method includes segment check.
1. Create pfile from spfile to edit
SQL> Create pfile='/tmp/initsid.ora' from spfile;
2. Shutdown the instance
3. set the following parameters in the pfile /tmp/initsid.ora
undo_management = manual
event = '10513 trace name context forever, level 2'
4. SQL>>startup restrict pfile='/tmp/initsid.ora'
5. SQL>select tablespace_name, status, segment_name from dba_rollback_segs where status != 'OFFLINE';
This is critical - we are looking for all undo segments to be offline - System will always be online.
If any are 'PARTLY AVAILABLE' or 'NEEDS RECOVERY' - Please open an issue with Oracle Support or update the current SR. There are many options from this moment and Oracle Support Analyst can offer different solutions for the bad undo segments.
If all offline then continue to the next step
6. Create new undo tablespace - example
SQL>create undo tablespace
7. Drop old undo tablespace
SQL>drop tablespace
8. SQL>shutdown immediate;
9 SQL>startup nomount; --> Using your Original spfile
10. Modify the spfile with the new undo tablespace name
SQL> Alter system set undo_tablespace = '
11. SQL>shutdown immediate;
12. SQL>startup; --> Using spfile
参考: https://www.cnblogs.com/kerrycode/p/6085447.html (ORA-00600 4194)
http://www.xifenfei.com/2012/01/ora-00600kcratr_nab_less_than_odr%E6%95%85%E9%9A%9C%E8%A7%A3%E5%86%B3.html (ora-00600
kcratr_nab_less_than_odr)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8520577/viewspace-2649286/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8520577/viewspace-2649286/