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恢复而不断报这个块错误。