暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

ORA-00600: internal error code, arguments: [kdsgrp1]模拟验证

原创 肖杰 2022-06-01
2438

ora-600 [kdsgrp1]错误,表示当读取操作无法找到期望的行时抛出。错误是在内存中发生的,因此可能是仅内存错误或磁盘损坏导致的错误。

构建测试表

## 创建测试表
create table kdsgrp_t as select * from dba_objects;

## 创建索引
SQL> create index idx_kdsgrp on kdsgrp_t(object_id);

Index created.

复制

BBED模拟索引和数据块不一致

BBED> set file 8 block 8595 FILE# 8 BLOCK# 8595 BBED> p kdbh struct kdbh, 14 bytes @124 ub1 kdbhflag @124 0x00 (NONE) sb1 kdbhntab @125 1 sb2 kdbhnrow @126 68 sb2 kdbhfrre @128 -1 sb2 kdbhfsbo @130 154 sb2 kdbhfseo @132 970 sb2 kdbhavsp @134 816 sb2 kdbhtosp @136 816 ## 此处选择row 6进行测试 BBED> p *kdbr[6] rowdata[6353] ------------- ub1 rowdata[6353] @7447 0x2c BBED> x /rcccnncttcccccnccccccccnnnn rowdata[6353] @7447 ------------- flag@7447: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@7448: 0x00 cols@7449: 22 col 0[3] @7450: SYS col 1[6] @7454: I_OBJ5 col 2[0] @7461: *NULL* col 3[2] @7462: 40 col 4[2] @7465: 40 col 5[5] @7468: INDEX col 6[7] @7474: 26-JAN-17 col 7[7] @7482: 26-JAN-17 col 8[19] @7490: 2017-01-26:13:52:45 col 9[5] @7510: VALID col 10[1] @7516: N col 11[1] @7518: N col 12[1] @7520: N col 13[2] @7522: 4 col 14[0] @7525: *NULL* col 15[4] @7526: NONE col 16[0] @7531: *NULL* col 17[1] @7532: Y col 18[1] @7534: N col 19[0] @7536: *NULL* col 20[1] @7537: N col 21[1] @7539: N ## 可以看到,此行object_id=40,object_Name=I_OBJ5,这里记录下来方便后面验证 BBED> dump offset 7447 File: /u01/app/oracle/oradata/HKORA/datafile/o1_mf_devin_js40tm87_.dbf (8) Block: 8595 Offsets: 7447 to 7958 Dba:0x02002193 ------------------------------------------------------------------------ 2c001603 53595306 495f4f42 4a35ff02 c12902c1 2905494e 44455807 7875011a 0e352e07 7875011a 0e352e13 32303137 2d30312d 32363a31 333a3532 3a343505 ## 将0x2c修改成0x3c,表示数据已经delete BBED> m /x 3c offset 7447 Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y File: /u01/app/oracle/oradata/HKORA/datafile/o1_mf_devin_js40tm87_.dbf (8) Block: 8595 Offsets: 7447 to 7958 Dba:0x02002193 ------------------------------------------------------------------------ 3c001603 53595306 495f4f42 4a35ff02 c12902c1 2905494e 44455807 7875011a 0e352e07 7875011a 0e352e13 32303137 2d30312d 32363a31 333a3532 3a343505 BBED> sum apply Check value for File 8, Block 8595: current = 0xff1d, required = 0xff1d
复制

模拟触发ORA-600

SQL> alter system flush buffer_cache; System altered. SQL> select /*+ full(t) */count(*) from kdsgrp_t t; COUNT(*) ---------- 73174 SQL> select count(object_id) from kdsgrp_t; COUNT(OBJECT_ID) ---------------- 73175 SQL> select * from kdsgrp_t where object_id=40; select * from kdsgrp_t where object_id=40 * ERROR at line 1: ORA-00600: internal error code, arguments: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], [] ## 可以看到表数据和索引数据不一致,缺少了一条记录,并且触发了ORA-600[kdsgrp1]错误
复制

分析trace文件

[TOC00000] Jump to table of contents Dump continued from file: /u01/app/oracle/diag/rdbms/hkora/hkora/trace/hkora_ora_9086.trc [TOC00001] ORA-00600: internal error code, arguments: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], [] [TOC00001-END] [TOC00002] ========= Dump for incident 878169 (ORA 600 [kdsgrp1]) ======== [TOC00003] ----- Beginning of Customized Incident Dump(s) ----- kdsDumpState: cdb: 0 dspdb: 0 type: 1 info: 0x5* kdsgrp1-1: *********************************************** row 0x02002193.6 continuation at: 0x02002193.6 file# 8 block# 8595 slot 6 not found (dscnt: 0) ## file_id=8,block_id=8595 KDSTABN_GET: 0 ..... ntab: 1 curSlot: 6 ..... nrows: 68 Dumping kcb descriptor: kcbds 0x7f48d4bea568: pdb 0, tsn 9, rdba 0x02002193, afn 8, objd 81778, cls 1, tidflg 0x8 0x80 0x0 dsflg 0x100000, dsflg2 0x4000, lobid 0x0:0, cnt 0, addr 0x14c108014, exf 0x10a65060, dx 0x0, ctx 0 whr: 'kdswh05: kdsgrp' env [0x7f48d4ccda84]: (scn: 0x0000000002ba7891 xid: 0x0000.000.00000000 uba: 0x00000000.0000.00 statement num=0 parent xid: 0x0000.000.00000000 st-scn: 0x0000000000000000 hi-scn: 0x0000000000000000 ma-scn: 0x0000000000000000 flg: 0x00000660) PIN buffer ---------------------------------------- SO: 0x7ce63a78, type: 54, owner: 0x65375ea0, flag: INIT/-/-/-/0x00 if: 0x1 c: 0x1 proc=0x7f99d360, name=buffer handle, file=kcb2.h LINE:3702, pg=0, conuid=0 (buffer) (CR) PR: 0x7f99d360 (ospid: 9086, name: oracle@devin-enmo (TNS V1-V3)) FLG: 0x100000 SEQ: 0x6108 class bit: 0x0 scan scn: 0x2ba7891 cr[2]: [0x7ce63b08, 0] [0x7ce67528, 17] sh[0]: kcbbfbp: [BH: 0x14cf5b438, LINK: 0x7ce63b08] pop 0 type: fast cr pin where: kdswh05: kdsgrp, why: 0 kcb_dw_scan_dumpctx: not in DW scan ktr in-mem trc empty env [0x7f48d4ccda84]: (scn: 0x0000000002ba7891 xid: 0x0000.000.00000000 uba: 0x00000000.0000.00 statement num=0 parent xid: 0x0000.000.00000000 st-scn: 0x0000000000000000 hi-scn: 0x0000000000000000 ma-scn: 0x0000000000000000 flg: 0x00000660) Block is pinned kdsgrp - dump CR block dba=0x02002193 buffer tsn: 9 rdba: 0x02002193 (8/8595) scn: 0x2ba5e76 seq: 0x02 flg: 0x04 tail: 0x5e760602 frmt: 0x02 chkval: 0xff1d type: 0x06=trans data Block header dump: 0x02002193 Object id on Block? Y seg/obj: 0x13f72 csc: 0x0000000002ba5e71 itc: 3 flg: E typ: 1 - DATA brn: 0 bdba: 0x2002190 ver: 0x01 opc: 0 inc: 0 exflg: 0 Itl Xid Uba Flag Lck Scn/Fsc 0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000000002ba5e71 0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 bdba: 0x02002193 data_block_dump,data header at 0x14c10807c =============== tsiz: 0x1f80 hsiz: 0x9a pbl: 0x14c10807c 76543210 flag=-------- ntab=1 nrow=68 frre=-1 fsbo=0x9a fseo=0x3ca avsp=0x330 tosp=0x330 0xe:pti[0] nrow=68 offs=0 0x12:pri[0] offs=0x1f0e 0x14:pri[1] offs=0x1e9a 0x16:pri[2] offs=0x1e29 0x18:pri[3] offs=0x1dcb 0x1a:pri[4] offs=0x1d57 0x1c:pri[5] offs=0x1cf9 0x1e:pri[6] offs=0x1c9b 0x20:pri[7] offs=0x1c27 0x22:pri[8] offs=0x1bc9 0x24:pri[9] offs=0x1b6b 0x26:pri[10] offs=0x1b03 0x28:pri[11] offs=0x1aa5 0x2a:pri[12] offs=0x1a46 0x2c:pri[13] offs=0x19e7 0x2e:pri[14] offs=0x197d 0x30:pri[15] offs=0x191f 0x32:pri[16] offs=0x18ab 0x34:pri[17] offs=0x1838 0x36:pri[18] offs=0x17be 0x38:pri[19] offs=0x175f 0x3a:pri[20] offs=0x1700 0x3c:pri[21] offs=0x16a1 0x3e:pri[22] offs=0x162e 0x40:pri[23] offs=0x15cf 0x42:pri[24] offs=0x1563 0x44:pri[25] offs=0x14f0 0x46:pri[26] offs=0x1491 0x48:pri[27] offs=0x141e 0x4a:pri[28] offs=0x13c0 0x4c:pri[29] offs=0x1347 0x4e:pri[30] offs=0x12e9 0x50:pri[31] offs=0x1275 0x52:pri[32] offs=0x120b 0x54:pri[33] offs=0x1198 0x56:pri[34] offs=0x112f 0x58:pri[35] offs=0x10bc 0x5a:pri[36] offs=0x1049 0x5c:pri[37] offs=0xfdd 0x5e:pri[38] offs=0xf78 0x60:pri[39] offs=0xf1b 0x62:pri[40] offs=0xea8 0x64:pri[41] offs=0xe35 0x66:pri[42] offs=0xdc1 0x68:pri[43] offs=0xd62 0x6a:pri[44] offs=0xd03 0x6c:pri[45] offs=0xca4 0x6e:pri[46] offs=0xc3e 0x70:pri[47] offs=0xbdf 0x72:pri[48] offs=0xb81 0x74:pri[49] offs=0xb02 0x76:pri[50] offs=0xaa3 0x78:pri[51] offs=0xa45 0x7a:pri[52] offs=0x9e7 0x7c:pri[53] offs=0x988 0x7e:pri[54] offs=0x92b 0x80:pri[55] offs=0x8cd 0x82:pri[56] offs=0x86e 0x84:pri[57] offs=0x80f 0x86:pri[58] offs=0x797 0x88:pri[59] offs=0x720 0x8a:pri[60] offs=0x6be 0x8c:pri[61] offs=0x65c 0x8e:pri[62] offs=0x5eb 0x90:pri[63] offs=0x585 0x92:pri[64] offs=0x50e 0x94:pri[65] offs=0x4a9 0x96:pri[66] offs=0x430 0x98:pri[67] offs=0x3ca block_row_dump: tab 0, row 0, @0x1f0e tl: 114 fb: --H-FL-- lb: 0x0 cc: 22 col 0: [ 3] 53 59 53 col 1: [ 3] 54 53 24 ... ... ... col 14: *NULL* col 15: [ 4] 4e 4f 4e 45 col 16: *NULL* col 17: [ 1] 59 col 18: [ 1] 4e col 19: *NULL* col 20: [ 1] 4e col 21: [ 1] 4e tab 0, row 6, @0x1c9b ### 可以看到row 6的数据确实已经不存在了,fb:--HDFL--中的D表示delete tl: 2 fb: --HDFL-- lb: 0x0 tab 0, row 7, @0x1c27 tl: 116 fb: --H-FL-- lb: 0x0 cc: 22 col 0: [ 3] 53 59 53 col 1: [ 5] 43 44 45 46 24 col 2: *NULL* col 3: [ 2] c1 20 col 4: [ 2] c1 1e col 5: [ 5] 54 41 42 4c 45 col 6: [ 7] 78 75 01 1a 0e 35 2e col 7: [ 7] 78 75 01 1a 0f 39 11 col 8: [19] 32 30 31 37 2d 30 31 2d 32 36 3a 31 33 3a 35 32 3a 34 35 ... ...
复制

根据缺失记录rowid查找索引条目

## 构建rowid,fileno=8,object_id=81778,block#=8595,row#=6,则可以根据此信息构建rowid SQL> select dbms_rowid.rowid_create(1,81778,8,8595,6) from dual; DBMS_ROWID.ROWID_C ------------------ AAAT9yAAIAAACGTAAG SQL> select * from devin.kdsgrp_t where rowid='AAAT9yAAIAAACGTAAG'; no rows selected ## 根据rowid确认数据已经查不到了 ## dump索引 SQL> select object_name,object_id from dba_objects where object_name='IDX_KDSGRP'; OBJECT_NAME OBJECT_ID -------------------- ---------- IDX_KDSGRP 81781 SQL> @tracefile VALUE ----------------------------------------------------------------- /u01/app/oracle/diag/rdbms/hkora/hkora/trace/hkora_ora_13500.trc SQL> alter session set events 'immediate trace name treedump level 81781'; Session altered. ## trc内容 [root@devin-enmo ~]# more /u01/app/oracle/diag/rdbms/hkora/hkora/trace/hkora_ora_13500.trc Trace file /u01/app/oracle/diag/rdbms/hkora/hkora/trace/hkora_ora_13500.trc Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production Build label: RDBMS_12.2.0.1.0_LINUX.X64_170125 ORACLE_HOME: /u01/app/oracle/product/12.2/dbhome_1 System name: Linux Node name: devin-enmo Release: 4.14.35-1818.3.3.el7uek.x86_64 Version: #2 SMP Mon Sep 24 14:45:01 PDT 2018 Machine: x86_64 Instance name: hkora Redo thread mounted by this instance: 1 Oracle process number: 82 Unix process pid: 13500, image: oracle@devin-enmo (TNS V1-V3) *** 2022-06-01T11:45:23.064277+08:00 *** SESSION ID:(273.23665) 2022-06-01T11:45:23.064291+08:00 *** CLIENT ID:() 2022-06-01T11:45:23.064294+08:00 *** SERVICE NAME:(SYS$USERS) 2022-06-01T11:45:23.064298+08:00 *** MODULE NAME:(sqlplus@devin-enmo (TNS V1-V3)) 2022-06-01T11:45:23.064301+08:00 *** ACTION NAME:() 2022-06-01T11:45:23.064304+08:00 *** CLIENT DRIVER:(SQL*PLUS) 2022-06-01T11:45:23.064307+08:00 ----- begin tree dump branch: 0x200049b 33555611 (0: nrow: 162, level: 1) leaf: 0x200049c 33555612 (-1: row:485.485 avs:823) leaf: 0x200049d 33555613 (0: row:479.479 avs:816) leaf: 0x200049e 33555614 (1: row:479.479 avs:816) leaf: 0x200049f 33555615 (2: row:479.479 avs:816) leaf: 0x20004a0 33555616 (3: row:479.479 avs:816) leaf: 0x20004a1 33555617 (4: row:478.478 avs:830) leaf: 0x20004a2 33555618 (5: row:479.479 avs:816) leaf: 0x20004a3 33555619 (6: row:479.479 avs:816) leaf: 0x20004a4 33555620 (7: row:479.479 avs:816) leaf: 0x20004a5 33555621 (8: row:478.478 avs:830) leaf: 0x20004a6 33555622 (9: row:479.479 avs:816) leaf: 0x20004a7 33555623 (10: row:479.479 avs:816) leaf: 0x20004a9 33555625 (11: row:479.479 avs:816) ## 因为测试数据row#=6的object_id=40,索引是有序的,肯定在第一个leaf block,接着dump第一个leaf block ## 转换block地址 SQL> select dbms_utility.data_block_address_file(33555612) fileno,dbms_utility.data_block_address_block(33555612) blkno from dual; FILENO BLKNO ---------- ---------- 8 1180 ## rowid共6字节,48bit,其中1-10bit代表relative_fno,17-32bit代表block number,33-48bit代表row number,则可以根据上述rowid转换出对应的16进制,转换方式如下: SQL> Select dbms_rowid.rowid_object('AAAT9yAAIAAACGTAAG') objid, dbms_rowid.rowid_relative_fno('AAAT9yAAIAAACGTAAG') rfno, dbms_rowid.rowid_block_number('AAAT9yAAIAAACGTAAG') blockno, dbms_rowid.rowid_row_number('AAAT9yAAIAAACGTAAG') rowno 6 from dual; OBJID RFNO BLOCKNO ROWNO ---------- ---------- ---------- ---------- 81778 8 8595 6 ## fno=8的二进制为: 1000,其中1-10表示fno,前面补0,具体表示为00000010 00000000 ## blkno=8595的二进制为:10000110010011,其中17-32表示blkno,前面补0,具体表示为00100001 10010011 ## rowno=6的二进制为:110,其中33-48表示rowno,前面补0,具体表示为00000000 00000110 ## 然后将二进制转化成16进制为(因为dump block里面的数据是16进制表示):02 00 21 93 00 06 ## 接下dump 索引的第一个block SQL> alter system dump datafile 8 block 1180; System altered. ## trace内容 row#37[7576] flag: -------, lock: 0, len=12 col 0; len 2; (2): c1 28 col 1; len 6; (6): 02 00 21 93 00 1c row#38[7564] flag: -------, lock: 0, len=12 col 0; len 2; (2): c1 29 col 1; len 6; (6): 02 00 21 93 00 06 row#39[7552] flag: -------, lock: 0, len=12 col 0; len 2; (2): c1 2a col 1; len 6; (6): 02 00 21 93 00 08 ## 可以看到row#38的col 1与上面转换出来的rowid匹配,col 0:c1 29表示键值40,如下: SQL> select utl_raw.cast_to_number(replace('c1 29',' ')) from dual; UTL_RAW.CAST_TO_NUMBER(REPLACE('C129','')) ------------------------------------------ 40
复制

当然,ORA-600[kdsgrp1]还有其它情况可能触发,这里只是模拟比较常见的,详细可参考MOS Doc ID 1332252.1

最后修改时间:2022-06-02 08:13:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 构建测试表
  • BBED模拟索引和数据块不一致
  • 模拟触发ORA-600
  • 分析trace文件
  • 根据缺失记录rowid查找索引条目