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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
目录