love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

非归档遭遇ora-00600 [kcratr_nab_less_than_odr]的恢复

刚刚很早之前认识的一个朋友说他们公司的开发库挂了,让我QQ远程帮忙看看,花了10分钟解决了了这个问题,分享一下.

主要遇到了如下几个问题:

1. mount 发现控制文件异常,通过替换,用pfile mount成功,这个不说了.
2. open报了一个如下的错误:

对于这个,比较少见,猜测可能是instance recovery的时候出现问题了。尝试手工recover database:

手工recover发现不行,看alert log报了一个error,看下对应的trace如下:

我们来仔细观察一下这个instance recovery的信息,得到如下的信息:
Thread 1 checkpoint: logseq 11782, block 2, scn 230294634
cache-low rba: logseq 11782, block 52177
on-disk rba: logseq 11783, block 1181, scn 230308328
start recovery at logseq 11782, block 52177, scn 0

线程检查点:    logseq 11782, block 2, scn 230294634
low cache rba: logseq 11782, block 52177
on disk rba:   logseq 11783, block 1181, scn 230308328

可以看到实例恢复的起点是low cache rba(实际上oracle会比较线程检查点和low cache rba,选择其中的较大者作为实例恢复的启点).

最后我们再来仔细分析下这个错误:
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [11783], [8],[1181], [], [], [], [], [], [], []

kcratr_nab_less_than_odr: 大胆猜测应该在进行比较某个值
[1] :     应该是指的thread number
[11783]: on disk rba的logseq 值
[8]: 这里未知
[1181]:  on disk rba的block号

最后搜了一下MOS,Oracle 给出的解释如下,关于这个ora-00600错误:

This caused a lost Write into the Online RedoLogs and so Instance Recovery is not possible and raising the ORA-600.

通俗一点讲,即online log的写丢失导致实例恢复无法恢复到指定的点,进而抛出这个ora-00600错误

对于on disk rba,这个是oracle instance recovery必须要达到的值,如果无法恢复到该值,那么将会出现异常,类似这里的问题.

既然明白了这一点,那么恢复就很容易了,首先重建下controlfile:

最后打开数据库,发现又报错了,不过还好,这是一个只要是DBA知道怎么解决的错了,如下:

实际上查看alert log 还看到了ora-00600 [4193]错误。 这个处理方法一样,不累述。

对于ora-00600 4193/4194错误,通过pfile指定undo_management=maual,然后启库重建undo即可,如下:

备注:对于重建controlfile后,记得添加tempfile,不要给人接埋地雷!

ORA-600 [kcratr_nab_less_than_odr] during Instance Recovery after Database Crash (文档 ID 1299564.1)
Alter database open fails with ORA-00600 kcratr_nab_less_than_odr (文档 ID 1296264.1)

 

Leave a Reply

You must be logged in to post a comment.