ORA-00600 2662

APPLIES TO

Operating System - Oracle Linux Server 7.9
Oracle Database - Enterprise Edition - version 11.2.0.4.0
Oracle Grid Infrastructure - version 11.2.0.4.0

SYMPTOMS

在一次数据库恢复过程中,使用_ALLOW_RESETLOGS_CORRUPTION = TRUE 这个隐含参数来强制打开数据库,遇到 ORA-00600: internal error code, arguments: [2662] 报错如下:

Errors in file /app/oracle/admin/rac/udump/rac1_ora_3997860.trc:ORA-00600: internal error code, arguments: [2662], [3186] [3707069194], [3186], [3707142625], [29580553], [], []

CAUSE

关于 ORA-00600: internal error code, arguments: [2662] 这个报错的解释如下:
ORA-00600 [2662] “Block SCN is ahead of Current SCN”,说明当前数据库的据块的 SCN 早于当前的 SCN,主要是和存储在 UGA 变量中的 dependent SCN 进行比较,如当前的 SCN 小于它,数据库就会产生这个 ORA-00600 [2662] 的错误了。这个错误一共有 5 个数,分别代表不同的含义

ORA-00600 [2662] [a] [b] {c} [d] [e]

Arg [a] Current SCN WRAP;
Arg [b] Current SCN BASE;
Arg {c} dependent SCN WRAP;
Arg [d] dependent SCN BASE;
Arg [e] Where present this is the DBA where the dependent SCN came from.

我们分析错误中的提示,它的参数 b=3707069194,d=3707142625, 表明当前的 SCN 确实小于 dependent SCN,所以产生了这个 ORA-00600 的错误。
通过查阅 oracle metalink 文档得知,出现这个报错主要有以下原因:

  1. 使用隐含参数_ALLOW_RESETLOGS_CORRUPTION 后 resetlogs 打开数据库;
  2. 恢复了控制文件但是没有使用 recover database using backup controlfile 进行恢复;
  3. 数据库 crash 后设置了_DISABLE_LOGGING 隐含参数;
  4. 在并行服务器环境中 DLM 存在问题;
  5. 硬件错误引起数据库没法写控制文件和重做日志文件;
  6. 错误的部分恢复数据库。

SOLUTION

ORA-00600: internal error code, arguments: [2662] 这个报错的方法如下:

  1. 如果 SCN 相差不多,可以通过多次重起数据库解决(每次加 1)

  2. 通过 10015 ADJUST_SCN 事件来增进 current SCN
    1)计算 level
    1.1) Arg [c] * 4 得出一个数值,假设为 V_Wrap
    1.2) 如果 Arg [d] = 0,则 V_Wrap 值为需要的 level
    Arg [d] < 1073741824,V_Wrap+1 为需要的 level
    Arg [d] < 2147483648,V_Wrap+2 为需要的 level
    Arg [d] < 3221225472,V_Wrap+3 为需要的 level
    1.3)SCN 被增进了 1024 x 1024 x 1024 x level(level x 10 billion)
    2)执行内部事件将数据库强行打开

    alter session set events '10015 trace name adjust_scn level N';

    注:mount 状态下执行(open 下无效)