ORA-600 [2662]

因为同事在做ogg同步的时间没有备份配置表,所以需要从原始的备份集中恢复一下,采用了恢复表对应表空间的方式。在启动数据库的过程中遇到了ORA-600 2662的错误,数据库版本为11.0.2.4.7,下文中会对在对应的方法处写出处理过程。

metalink对这个错误的描述如下
ORA-00600: internal error code, arguments: [2662], [0], [547743994], [0], [898092653], [8388617], [], []
这个报错参数的含义在metalink中如此描述的:
Arg [a] Current SCN WRAP
Arg [b] Current SCN BASE
Arg [c] dependent SCN WRAP
为了存储更大的SCN值,当SCN BASE到足够大并开始重置的时候,SCN WRAP将加1。
Arg [d] dependent SCN BASE
Arg [e] Where present this is the DBA where the dependent SCN came from.
也就是Arg [d] 的值是从哪个block中找到的,通常是一个data block address。
通过这几个参数根据一定的规则可以计算出我们需要的level。计算规则如下:
1. Arg [c] *4得出一个数值,假设为V_Wrap
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.ADJUST_SCN
在oracle 10g之前一般采用这个event方式来增大SCN,比如错误ORA-00600: internal error code, arguments: [2662], [0], [2179133], [8656], [70114056], [33855201], [], []
Arg [C] *4 = 8656 * 4 = 34624
Arg [d] = 70114056 < 1073741824
所以level = 34624 + 1 = 34625
因此在这个例子中我们应该执行
alter session set events ‘IMMEDIATE trace name ADJUST_SCN level 34625’;
但是随着oracle scn的patch更新后,11g后续的版本有些已经不能使用这种方式推进scn了.
11.2.0.4,12.0.1.0默认屏蔽;11.2.0.2.5屏蔽;

  1. _minimum_giga_scn
    这个参数可以将SCN提高1G的倍数,即1024*1024*1024.

ALTER system SET “_minimum_giga_scn” = 1 scope = spfile;

或者在pfile里加入
但是随着oracle scn的patch更新后,11g后续的版本有些已经不能使用这种方式推进scn了.
11.2.0.4,12.0.1.0默认屏蔽;

  1. 修改控制文件推进SCN
    dump函数联合ue修改
  2. ORADEBUG推进SCN
    本文使用这个方法,因为在11.2.0.4这个版本中已经不能使用前面2种方法。

首先在pfile里增加 _allow_resetlogs_corruption = true
Mount后open数据库,数据库报错ORA-600[2262],为SCN不一致。报错信息如下
ORA-00600: internal error code, arguments: [2662], [16], [1673921290], [16], [1681428398], [12583040], [], [], [], [], [], []

简单的计算过程
1681428398 < 2147483648,V_Wrap = Arg [c] 4 = 164 = 64;
V_Wrap+2为需要的level = 64+ 2 = 66

对level 66计算 6610241024*1024=70866960384。
换算为16进制:
select to_char(70866960384,’XXXXXXXXXXXXXXXXXXXX’) from dual;
得到16进制0x0x1080000000

SQL> oradebug setmypid
Statement processed.
SQL> 
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> oradebug poke 0x06001AE70 8 0x1080000000    ---------------big endian和small endian这里有区别
BEFORE: [06001AE70, 06001AE78) = 00000000 00000000
AFTER:  [06001AE70, 06001AE78) = 80000000 00000010
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 80000000 00000010 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> alter database open;

Database altered.

open数据库后导出需要的数据。

此条目发表在rman分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s