Skip to content

18019

ORA-00600[kddummy_blkchk][28][2756885][18019][][]

ORA-00600[kddummy_blkchk][28][2756885][18019][][]

 

 

 

—————————————————————-

解决这个故障的思路以及涉及知识点:

 

 1.db_block_checksum原理

 2.tablemove

 3.诊断事件

 4.回滚段管理

 5.rman and dbv

 

这个故障大概的情况是这样的,系统突然关闭(未知原因),再次startup后,稍微过几分钟smon进程自杀

 

等到有人通知时候,跟踪文件都膨胀到16m了,

 

大致内容:

 

Block recovery from logseq 45928, block 55 to scn 1767964025

Tue May 24 17:01:44 2011

Recovery of Online Redo Log: Thread 1 Group 6 Seq 45928 Reading mem 0

  Mem# 0: /oracle2/oracle/oradata/orcl/redo6.log

Block recovery completed at rba 45928.3128.16, scn 0.1767964026

Tue May 24 17:01:45 2011

Errors in file /oracle2/oracle/admin/orcl/bdump/orcl_smon_5751.trc:

ORA-00600: internal error code, arguments: [kddummy_blkchk], [28], [2756885], [18019], [], [], [], []

Tue May 24 17:02:26 2011

Doing block recovery for file 28 block 2756885

Block recovery from logseq 45928, block 55 to scn 1767964025

Tue May 24 17:02:26 2011

Recovery of Online Redo Log: Thread 1 Group 6 Seq 45928 Reading mem 0

  Mem# 0: /oracle2/oracle/oradata/orcl/redo6.log

Block recovery completed at rba 45928.3128.16, scn 0.1767964026

Tue May 24 17:02:26 2011

 

…………………………………….

 

在trc文件里就是smon不断尝试回滚的信息,但是多次尝试回滚失败后自杀

 

开始以为是bug,

经查阅有一个bug相似:

[ID 454909.1]

但是这里是

 

create table foo

      2  ( c1 number)

      3  tablespace default_users;

    create table foo

    *

    ERROR at line 1:

    ORA-00607: Internal error occurred while making a change to a data block

    ORA-00600: internal error code, arguments: [kddummy_blkchk], [36], [432394],

    [18019], [], [], [], []

 

而且出现的原因经oracle验证是9i升级到10203,而且是通过TTS升级方式在assm类型的表里才出现的

 

这里就失望了,这里版本是10204,可以把这个bug排除了

 

下来根据trc的信息看到smon一直在尝试不断回滚,那么就把回滚表空间设置为手动管理,并设置_corrupted_rollback_segments参数到_syssmu20$,追加到50也报错

 

重试后还是报这个错误。

 

然后尝试设置10513事件中止smon回滚,重试后依然报这个错误

 

这不是坏块,但是还是忍不住对28号文件做了一个DBV,但是检测并未发现坏块。

 

绝望之余,死马当活马医,尝试了blockrecover ,明明知道还是会报这个错。

 

然就就尝试了下面的办法:

这个办法来源blog

http://www.oracledatabase12g.com/message-board

通过设置DB_BLOCK_CHECKSUM为OFF来绕过,具体方法如下:

 

alter system set DB_BLOCK_CHECKSUM = OFF;

 

将corrupt block所在数据表,如你这里的NR_AIN_SMP_18_R 执行move操作 —- 报错的28是值得28号文件,2756885指的28号文件里的块号,根据块号通过dba_extents就可以找到对象了

 

alter table NARI.NR_AIN_SMP_18_R move;

 

之后重建该表上的所有索引

 

alter index XXX rebuild online tablespace ***;

 

问题解决。原来是块头的sum和记录的不符合,导致oracle在执行checksum的时候找不到对应的undo恢复而不断报这个块错误。