简单记录一次ORA-00600 kcratr_nab_less_than_odr

当前具体报错已经没有了,仅仅有对应图。參考EYGLE一篇文章中数据:

1.故障现象

数据库版本号11G,错误类似下面:

ORA-00600: 内部错误代码, 參数: [kcratr_nab_less_than_odr]错误。详细的错误信息类似:
Incident 63078 created, dump file: /u01/diag/rdbms/orcl/orcl/incident/incdir_63078/orcl_ora_1916_i63078.trc
ORA-00600: 内部错误代码, 參数: [kcratr_nab_less_than_odr], [1], [3313], [2328320], [2334233], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 參数: [kcratr_nab_less_than_odr], [1], [3313], [2328320], [2334233], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 參数: [kcratr_nab_less_than_odr], [1], [3313], [2328320], [2334233], [], [], [], [], [], [], []

ALERT日志中有下面:

Thread 1 checkpoint: logseq 3313, block 2, scn 5965899084787
  cache-low rba: logseq 3313, block 1484161
    on-disk rba: logseq 3313, block 2334233, scn 5965899135009
  start recovery at logseq 3313, block 1484161, scn 0

600错误中的1。3313的含义。是Thread 1 logseq 3313,那么剩下的就应该是恢复时的rba地址,错误提示中的2334233是On-Disk Rba,是恢复应该到达的终点,而2328320小于On-Disk Rba。就应该是Less Than里面提到的恢复的终点,由于没有到达Redo的最后位置,被觉得是非法的,可能丢失数据。
TRACE文件里会有对应的提示:

WARNING! Crash recovery of thread 1 seq 3313 is
ending at redo block 2328320 but should not have ended before
redo block 2334233

我遇到的问题当时仅仅有图片例如以下


原因可能是由于实例恢复的进度不够(由于Redo丢失或者硬件故障导致的REDO不完整--坏块)。

这一点能够从当时报错的TRACE文件的图片中得到验证。

从图中能够看到,须要最少恢复到的ON DISK RBA是block24955,而当前能恢复到的是24957,有部分块丢失,因此报错。

2.故障解决

首先尝试通过RECOVER DATABASE; RECOVERDATABASEUNTIL CANCEL;等方式进行恢复,可是未解决此问题。

终于通过重建控制文件、再进行不全然恢复来OPEN数据库。

(前提是客户仅仅要求OPEN库,是客户的測试库,丢些数据没关系。假设是生产库不同意丢数据,此方法就不适用了)

使用命令类似下面:

MOUNT状态下: ALTERDATABASEBACKUP CONTROLFILE TOTRACE AS'/home/oracle/a.txt';

使用备份的控制文件里内容,在SQLPLUS窗体运行类似下面:

CREATECONTROLFILE REUSE DATABASE…………

Alter database recover database until cancel using backup controlfile;

Alter database open resetlogs;  

并新建暂时表空间。

參考链接:http://www.xifenfei.com/2347.html      http://www.eygle.com/archives/2010/05/kcratr_nab_less_than_odr.html
原文地址:https://www.cnblogs.com/llguanli/p/6780061.html