ORA-00600-[kcratr_nab_less_than_odr]问题小记

上午一实施哥们来求救说一个做ETL的数据库无法启动了,出现了ORA-00600的错误。之前也遇到过几次ORA-00600内部错误的问题,几次都是因为数据库服务器异常断电导致的,这类错误一般是oracle自己内部的bug。下面记录下解决的过程:

1、先将数据库启动到mount状态,没有问题,说明数据库成功的打开控制文件。

1
2
3
4
5
6
7
8
9
SQL> startup mount
ORACLE instance started.
Total System Global Area 8217530368 bytes
Fixed Size 2214856 bytes
Variable Size 5100274744 bytes
Database Buffers 3087007744 bytes
Redo Buffers 28033024 bytes
Database mounted.

2、尝试open数据库,此时主要会读取数据文件、redo日志等。

1
2
3
4
5
6
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1],
[4252], [17024], [17032], [], [], [], [], [], [], []

此时提示了ORA-00600: internal error code错误信息,这类错误一般是oracle自己内部的bug,在12C之后就没有了。此类信息的重点在arguments之后,但是一般也没有很具体的信息,此时我们可以在trace目录查看alert日志,若信息还不够明确,再根据alter log中相应的trc文件获取具体信息。
之前也遇到过类似的情况,看到arguments: [kcratr_nab_less_than_odr]也就明白了原因——服务器异常断电,导致LGWR写联机日志文件时失败,由于数据库异常停机,所以启动的时候需要做实例级恢复,因为写联机日志失败所以无法从中获取这些redo信息。说说ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1],[4252], [17024], [17032]的意思:1号线程实例需要恢复日志序列号为4252的联机日志文件,需要恢复到编号为17032的日志块,而实际上只能恢复到第17024个日志块。
3、下面看看怎么解决。查看当前日志文件信息:

1
2
3
4
5
6
7
SQL> select group#,sequence#,status,first_time,next_change# from v$log;
GROUP# SEQUENCE# STATUS FIRST_TIM NEXT_CHANGE#
---------- ---------- ---------------- --------- ------------
1 4252 CURRENT 06-MAR-18 2.8147E+14
3 4251 INACTIVE 06-MAR-18 4.9009E+12
2 4250 INACTIVE 06-MAR-18 4.9009E+12

当前日志组组号为1,再通过v$logfile查看组号为1的redo日志的文件位置

1
2
3
4
5
6
7
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- ------------------------------
1 ONLINE /home/wonders/app/wonders/oradata/orcl/redo01.log
3 ONLINE /home/wonders/app/wonders/oradata/orcl/redo03.log
2 ONLINE /home/wonders/app/wonders/oradata/orcl/redo02.log

指定redo1.log恢复数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 4900911271334 generated at 03/06/2018 05:46:29 needed for
thread 1
ORA-00289: suggestion :
/home/wonders/app/wonders/flash_recovery_area/ORCL/archivelog/2018_03_12/o1_mf_1
_4252_%u_.arc
ORA-00280: change 4900911271334 for thread 1 is in sequence #4252
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/home/wonders/app/wonders/oradata/orcl/redo01.log
Log applied.
Media recovery complete.

恢复完成后必须以RESETLOGS方式打开数据库

1
2
3
SQL> alter database open resetlogs;
Database altered.