情景
数据库在启动时抛出如下错误
ORA-00604: error occurred at recursive SQL level 1 ORA-00607: Internal error occurred while making a change to a data block ORA-00600: internal error code, arguments: [4194], [7], [7], [], [], [], [], [] |
从数据库启动报错可以看出在递归调用SQL出现错误,最终错误为ORA-600[4194]。
这里尝试屏蔽所有的undo segment 进行启动,得到结果还是报错.通过手工创建pfile增加参数,开启trace查看问题出现点
数据库启动mount状态下,recover database;
oradebug setmypid oradebug unlimit --dump回滚段回滚前后信息 ALTER SESSION SET events '10015 trace name context forever, level 10'; --错误errorstack ALTER SESSION SET events '604 trace trace name errorstack level 10'; --sql执行顺序 ALTER SESSION SET events '10046 trace name context forever, level 12'; oradebug tracefile_name |
分析
从10046的trace看到
---------------------------------------------- WAIT #2: nam='control file sequential read' ela= 11 file#=0 block#=1 blocks=1 obj#=-1 tim=3207213661467 WAIT #2: nam='control file sequential read' ela= 11 file#=1 block#=1 blocks=1 obj#=-1 tim=3207213661491 WAIT #2: nam='control file sequential read' ela= 10 file#=2 block#=1 blocks=1 obj#=-1 tim=3207213661512 WAIT #2: nam='control file sequential read' ela= 8 file#=0 block#=15 blocks=1 obj#=-1 tim=3207213661533 WAIT #2: nam='control file sequential read' ela= 8 file#=0 block#=17 blocks=1 obj#=-1 tim=3207213661553 *** 2015-08-25 18:18:56.341 ksedmp: internal or fatal error ORA-00600: internal error code, arguments: [4194], [7], [7], [], [], [], [], [] Current SQL statement for this session: update undo$ set name=:2,file#=:3,block#=:4,status$=:5,user#=:6,undosqn=:7,xactsqn=:8,scnbas=:9,scnwrp=:10,inst#=:11,ts#=:12,spare1=:13 where us#=:1 |
看到的SQL为Updata undo$表而出现问题.
Call stack ----- Call Stack Trace ----- calling call entry argument values in hex location type point (? means dubious value) -------------------- -------- -------------------- ---------------------------- ksedst+001c bl ksedst1 000000000 ? FFFFFFFFFFD868E ? ksedmp+0290 bl ksedst 104A2C670 ? ksfdmp+0018 bl 03F263A4 kgeriv+0108 bl _ptrgl |
因为前面报错号中存在ORA-607,尝试文件中查找Error 607
Dump event group for SESSION 10046 trace name CONTEXT level 12, forever 10015 trace name CONTEXT level 10, forever Dump event group for SYSTEM Error 607 in redo application callback -->607的错误信息 |
–下面查看redo的信息
TYP:0 CLS:16 AFN:1 DBA:0x00400191 -->undo块地址 OBJ:4294967295 SCN:0x0001.2483756a SEQ: 1 OP:5.1 -->Undo block or undo segment header - KTURDB ktudb redo: siz: 256 spc: 6602 flg: 0x0012 seq: 0x0040 rec: 0x07 xid: 0x0000.03e.0000003d ktubl redo: slt: 62 rci: 0 opc: 11.1 objn: 15 objd: 15 tsn: 0 Undo type: Regular undo Begin trans Last buffer split: No Temp Object: No Tablespace Undo: No 0x00000000 prev ctl uba: 0x00400191.0040.06 -->uba地址 prev ctl max cmt scn: 0x0001.24833ccb prev tx cmt scn: 0x0001.24833d19 txn start scn: 0xffff.ffffffff logon user: 0 prev brb: 4194701 prev bcl: 0 KDO undo record: KTB Redo op: 0x04 ver: 0x01 op: L itl: xid: 0x0000.028.0000003d uba: 0x00400191.0040.06 flg: C--- lkc: 0 scn: 0x0001.248372a6 KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x0040006a hdba: 0x00400069 -->更新块地址 -->更新块所在的区域头地址(可能是一级位图去) itli: 1 ispac: 0 maxfr: 4863 tabn: 0 slot: 9(0x9) flag: 0x2c lock: 0 ckix: 0 ncol: 17 nnew: 12 size: 0 col 1: [ 9] 5f 53 59 53 53 4d 55 39 24 -->_SYSSMU9$ col 2: [ 2] c1 02 -->2 col 3: [ 2] c1 03 --> col 4: [ 3] c2 02 26 --> col 5: [ 6] c5 07 0d 25 37 21 col 6: [ 2] c1 02 col 7: [ 4] c3 0d 11 58 col 8: [ 4] c3 05 63 43 col 9: [ 1] 80 col 10: [ 2] c1 06 col 11: [ 2] c1 02 col 16: [ 2] c1 02 Block after image is corrupt: buffer tsn: 0 rdba: 0x00400191 (1/401) scn: 0x0001.2483756a seq: 0x01 flg: 0x04 tail: 0x756a0201 frmt: 0x02 chkval: 0xc677 type: 0x02=KTU UNDO BLOCK Hex dump of block: st=0, typ_found=1 |
10046的绑定变量
PARSING IN CURSOR #2 len=148 dep=1 uid=0 oct=6 lid=0 tim=3207213633716 hv=3540833987 ad='6e989e58' UPDATE undo$ SET name=:2, file#=:3, block#=:4, STATUS$=:5, USER#=:6, undosqn=:7, xactsqn=:8, scnbas=:9, scnwrp=:10, inst#=:11, ts#=:12, spare1=:13 WHERE us#=:1 END OF STMT PARSE #2:c=10000,e=18293,p=5,cr=44,cu=0,mis=1,r=0,dep=1,og=4,tim=3207213633715 BINDS #2: kkscoacd Bind#0 VALUE="_SYSSMU9$" Bind#1 VALUE=2 Bind#2 VALUE=137 Bind#3 VALUE=6 Bind#4 VALUE=1 Bind#5 VALUE=49866 Bind#6 VALUE=121687 Bind#7 VALUE=612365432 Bind#8 VALUE=1 Bind#9 VALUE=0 Bind#10 VALUE=1 Bind#11 VALUE=1 Bind#12 VALUE=9 |
验证
col name for a40 select f_get_from_dump(replace('5f 53 59 53 53 4d 55 39 24',' ',','),'varchar2') name from dual; |
从绑定变量信息来看和dump的信息一样.
上面的一些值已表示出大部分含义.下面我们关注几个点.
xid: 0x0000.028.0000003d uba: 0x00400191.0040.06 xid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrap uba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry.in.UNDO.Record.Map |
从XID中可以看出此undo segment 的段号,为0.也就是system Undo段。
UBA为0x00400191.
现在知道了undoblock的地址,这样就可以去dump下块的信息
rdba 0x00400191 rdba: 0x400191(4194705) file: 1 ,block : 401 dump undo段头和undo block alter system dump datafile 'xxxx/system01.dbf' block 9; alter system dump datafile 'xxxx/system01.dbf' block 401; |
原因
undo段头的信息 TRN CTL:: seq: 0x0040 chd: 0x003e ctl: 0x0028 inc: 0x00000000 nfb: 0x0001 -->一个空闲列表 mgc: 0x8002 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe) uba: 0x00400191.0040.06 scn: 0x0001.24833ccb -->下次使用这个块和上面下信息一直 Version: 0x01 FREE BLOCK POOL:: -->freelist uba: 0x00400191.0040.06 ext: 0x4 spc: 0x19ca --> 6602 uba: 0x00000000.0035.37 ext: 0x5 spc: 0x80c uba: 0x00000000.0034.37 ext: 0x4 spc: 0x550 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 |
从uba里发现的信息和上面看的一直。然后查看undo block
dump undo 块
******************************************************************************** UNDO BLK: xid: 0x0000.03e.0000003d seq: 0x40 cnt: 0x7 irb: 0x7 icl: 0x0 flg: 0x0000 Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset --------------------------------------------------------------------------- 0x01 0x1ee8 0x02 0x1de8 0x03 0x1ce8 0x04 0x1be8 0x05 0x1ae8 0x06 0x19e8 0x07 0x18e8 -->这里显示Last.Entry为0x07 |
我们都知道uba的最后一位代表Last.Entry.in.UNDO.Record.Map。这里出现了问题.段头里记录为6,Block里记录为7.这样我们就找到原因 undo segment 头 记录的信息和undo block 里不一致.
Fixed
下面为两种修复方式
1.改为undo segment block和undo block 信息一致
2.让undo 在使用时不使用此块/或者从头开始
–方法一:
参考我以前的操作案例
http://www.traveldba.com/archives/650
系统undo block 计算方式
此类块的使用空间为block_size – block_header_size(kcbh) – tailchk (4)
大家都值oracle的块的使用方式为从下往上。如果告诉你我最后一条记录从offset为6000,这就是6000到blocksize -4 的空间全部被用了.所以这里计算使用空间为
使用的大小为: blocsize – tailchk – 最后一次记录的开始位置offset – block_header
转化成数据:
8192-4 - 0x18e8(6376) - 20 = 1792 --使用大小 计算剩余空间为: block_size - block_header_size(kcbh) - tailchk (4)-14 (undo 一些基本信息) - 3*2 -使用的大小= free space 转化成数据: 8192 - 20 - 4 - 14 - 7*2 - 1792 = 6348 得到这些值,我们就可以修改 Version: 0x01 FREE BLOCK POOL:: -->freelist uba: 0x00400191.0040.06 ext: 0x4 spc: 0x19ca --> 6602 把06改成07,0x19ca(6602)改成6348 uba: 0x00000000.0035.37 ext: 0x5 spc: 0x80c uba: 0x00000000.0034.37 ext: 0x4 spc: 0x550 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 |
–方法二
$ bbed Password: BBED: Release 2.0.0.0.0 - Limited Production ON Wed Aug 26 09:03:26 2015 Copyright (c) 1982, 2007, Oracle. ALL rights reserved. ************* !!! FOR Oracle Internal USE ONLY !!! *************** BBED> SET filename '/oradata/orcl/system01.dbf' FILENAME /u02/PIC/PLHIS/system01.dbf BBED> SHOW ALL FILE# 0 BLOCK# 1 OFFSET 0 DBA 0x00000000 (0 0,1) FILENAME /u02/PIC/PLHIS/system01.dbf BIFILE bifile.bbd LISTFILE BLOCKSIZE 8192 MODE Browse EDIT Unrecoverable IBASE DEC OBASE DEC WIDTH 80 COUNT 512 LOGFILE log.bbd SPOOL No BBED> SET mode edit MODE Edit BBED> SHOW ALL FILE# 0 BLOCK# 1 OFFSET 0 DBA 0x00000000 (0 0,1) FILENAME /u02/PIC/PLHIS/system01.dbf BIFILE bifile.bbd LISTFILE BLOCKSIZE 8192 MODE Edit EDIT Unrecoverable IBASE DEC OBASE DEC WIDTH 80 COUNT 512 LOGFILE log.bbd SPOOL No |
查看block信息
BBED> set block 9 BLOCK# 9 BBED> map /v File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Dba:0x00000000 ------------------------------------------------------------ Unlimited Undo Segment Header struct kcbh, 20 bytes @0 ub1 type_kcbh @0 ub1 frmt_kcbh @1 ub1 spare1_kcbh @2 ub1 spare2_kcbh @3 ub4 rdba_kcbh @4 ub4 bas_kcbh @8 ub2 wrp_kcbh @12 ub1 seq_kcbh @14 ub1 flg_kcbh @15 ub2 chkval_kcbh @16 ub2 spare3_kcbh @18 struct ktech, 72 bytes @20 ub4 spare1_ktech @20 word tsn_ktech @24 ub4 lastmap_ktech @28 ub4 mapcount_ktech @32 ub4 extents_ktech @36 ub4 blocks_ktech @40 ub2 mapend_ktech @44 struct hwmark_ktech, 32 bytes @48 struct locker_ktech, 8 bytes @80 ub4 flag_ktech @88 struct ktemh, 16 bytes @92 ub4 count_ktemh @92 ub4 next_ktemh @96 ub4 obj_ktemh @100 ub4 flag_ktemh @104 struct ktetb[6], 48 bytes @108 ub4 ktetbdba @108 ub4 ktetbnbk @112 struct ktuxc, 104 bytes @4148 struct ktuxcscn, 8 bytes @4148 struct ktuxcuba, 8 bytes @4156 sb2 ktuxcflg @4164 ub2 ktuxcseq @4166 sb2 ktuxcnfb @4168 ub4 ktuxcinc @4172 sb2 ktuxcchd @4176 sb2 ktuxcctl @4178 ub2 ktuxcmgc @4180 ub4 ktuxcopt @4188 struct ktuxcfbp[5], 60 bytes @4192 struct ktuxe[255], 10200 bytes @4252 ub4 ktuxexid @4252 ub4 ktuxebrb @4256 struct ktuxescn, 8 bytes @4260 sb4 ktuxesta @4268 ub1 ktuxecfl @4269 sb2 ktuxeuel @4270 ub4 tailchk @8188 |
设置空闲列表为空
TRN CTL:: seq: 0x0040 chd: 0x003e ctl: 0x0028 inc: 0x00000000 nfb: 0x0001 -->一个空闲列表 |
BBED> set offset 4168 OFFSET 4168 BBED> p ktuxc.ktuxcnfb -------------- sb2 ktuxcnfb @4168 1 BBED> dump count 1 File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Offsets: 4168 to 4168 Dba:0x00000000 ------------------------------------------------------------------------ 00 <32 bytes per line> BBED> dump count 20 File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Offsets: 4168 to 4187 Dba:0x00000000 ------------------------------------------------------------------------ 00010000 00000000 003e0028 80020001 00680000 <32 bytes per line> BBED> m 0x0000 Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Offsets: 4168 to 4187 Dba:0x00000000 ------------------------------------------------------------------------ 00000000 00000000 003e0028 80020001 00680000 <32 bytes per line> BBED> p ktuxc.ktuxcnfb -------------- sb2 ktuxcnfb @4168 0 |
清空undo block 信息
FREE BLOCK POOL:: -->freelist uba: 0x00400191.0040.06 ext: 0x4 spc: 0x19ca --> 6602 |
BBED> p ktuxc struct ktuxc, 104 bytes @4148 struct ktuxcscn, 8 bytes @4148 ub4 kscnbas @4148 0x24833ccb ub2 kscnwrp @4152 0x0001 struct ktuxcuba, 8 bytes @4156 ub4 kubadba @4156 0x00400191 ub2 kubaseq @4160 0x0040 ub1 kubarec @4162 0x06 sb2 ktuxcflg @4164 1 (KTUXCFSK) ub2 ktuxcseq @4166 0x0040 sb2 ktuxcnfb @4168 0 ub4 ktuxcinc @4172 0x00000000 sb2 ktuxcchd @4176 62 sb2 ktuxcctl @4178 40 ub2 ktuxcmgc @4180 0x8002 ub4 ktuxcopt @4188 0x7ffffffe struct ktuxcfbp[0], 12 bytes @4192 struct ktufbuba, 8 bytes @4192 ub4 kubadba @4192 0x00400191 ub2 kubaseq @4196 0x0040 ub1 kubarec @4198 0x06 sb2 ktufbext @4200 4 sb2 ktufbspc @4202 6602 struct ktuxcfbp[1], 12 bytes @4204 struct ktufbuba, 8 bytes @4204 ub4 kubadba @4204 0x00000000 ub2 kubaseq @4208 0x0035 ub1 kubarec @4210 0x37 sb2 ktufbext @4212 5 sb2 ktufbspc @4214 2060 struct ktuxcfbp[2], 12 bytes @4216 struct ktufbuba, 8 bytes @4216 ub4 kubadba @4216 0x00000000 ub2 kubaseq @4220 0x0034 ub1 kubarec @4222 0x37 sb2 ktufbext @4224 4 sb2 ktufbspc @4226 1360 struct ktuxcfbp[3], 12 bytes @4228 struct ktufbuba, 8 bytes @4228 ub4 kubadba @4228 0x00000000 ub2 kubaseq @4232 0x0000 ub1 kubarec @4234 0x00 sb2 ktufbext @4236 0 sb2 ktufbspc @4238 0 struct ktuxcfbp[4], 12 bytes @4240 struct ktufbuba, 8 bytes @4240 ub4 kubadba @4240 0x00000000 ub2 kubaseq @4244 0x0000 ub1 kubarec @4246 0x00 sb2 ktufbext @4248 0 sb2 ktufbspc @4250 0 BBED> p ktuxc.ktuxcfbp[0] struct ktuxcfbp[0], 12 bytes @4192 struct ktufbuba, 8 bytes @4192 ub4 kubadba @4192 0x00400191 ub2 kubaseq @4196 0x0040 ub1 kubarec @4198 0x06 sb2 ktufbext @4200 4 sb2 ktufbspc @4202 6602 BBED> set offset 4192 OFFSET 4192 BBED> dump File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Offsets: 4192 to 4211 Dba:0x00000000 ------------------------------------------------------------------------ 00400191 00400600 000419ca 00000000 00353700 <32 bytes per line> BBED> m /x 00000000 File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Offsets: 4192 to 4211 Dba:0x00000000 ------------------------------------------------------------------------ 00000000 00400600 000419ca 00000000 00353700 <32 bytes per line> |
BBED> p kcbh struct kcbh, 20 bytes @0 ub1 type_kcbh @0 0x0e ub1 frmt_kcbh @1 0xa2 ub1 spare1_kcbh @2 0x00 ub1 spare2_kcbh @3 0x00 ub4 rdba_kcbh @4 0x00400009 ub4 bas_kcbh @8 0x248372a6 ub2 wrp_kcbh @12 0x0001 ub1 seq_kcbh @14 0x01 ub1 flg_kcbh @15 0x04 (KCBHFCKV) ub2 chkval_kcbh @16 0xbe32 ub2 spare3_kcbh @18 0x0000 清空flg_kcbh BBED> set offset 15 OFFSET 15 BBED> m /x 00 File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Offsets: 15 to 34 Dba:0x00000000 ------------------------------------------------------------------------ 00be3200 00000000 00000000 00000000 00000000 <32 bytes per line> BBED> set offset 16 OFFSET 16 清空chkval BBED> m /x 0000 File: /u02/PIC/PLHIS/system01.dbf (0) Block: 9 Offsets: 16 to 35 Dba:0x00000000 ------------------------------------------------------------------------ 00000000 00000000 00000000 00000000 00000000 <32 bytes per line> BBED> p kcbh struct kcbh, 20 bytes @0 ub1 type_kcbh @0 0x0e ub1 frmt_kcbh @1 0xa2 ub1 spare1_kcbh @2 0x00 ub1 spare2_kcbh @3 0x00 ub4 rdba_kcbh @4 0x00400009 ub4 bas_kcbh @8 0x248372a6 ub2 wrp_kcbh @12 0x0001 ub1 seq_kcbh @14 0x01 ub1 flg_kcbh @15 0x00 (NONE) ub2 chkval_kcbh @16 0x0000 ub2 spare3_kcbh @18 0x0000 BBED> p ktuxc struct ktuxc, 104 bytes @4148 struct ktuxcscn, 8 bytes @4148 ub4 kscnbas @4148 0x24833ccb ub2 kscnwrp @4152 0x0001 struct ktuxcuba, 8 bytes @4156 ub4 kubadba @4156 0x00400191 ub2 kubaseq @4160 0x0040 ub1 kubarec @4162 0x06 sb2 ktuxcflg @4164 1 (KTUXCFSK) ub2 ktuxcseq @4166 0x0040 sb2 ktuxcnfb @4168 0 ub4 ktuxcinc @4172 0x00000000 sb2 ktuxcchd @4176 62 sb2 ktuxcctl @4178 40 ub2 ktuxcmgc @4180 0x8002 ub4 ktuxcopt @4188 0x7ffffffe struct ktuxcfbp[0], 12 bytes @4192 struct ktufbuba, 8 bytes @4192 ub4 kubadba @4192 0x00000000 ub2 kubaseq @4196 0x0040 ub1 kubarec @4198 0x06 sb2 ktufbext @4200 4 sb2 ktufbspc @4202 6602 struct ktuxcfbp[1], 12 bytes @4204 struct ktufbuba, 8 bytes @4204 ub4 kubadba @4204 0x00000000 ub2 kubaseq @4208 0x0035 ub1 kubarec @4210 0x37 sb2 ktufbext @4212 5 sb2 ktufbspc @4214 2060 struct ktuxcfbp[2], 12 bytes @4216 struct ktufbuba, 8 bytes @4216 ub4 kubadba @4216 0x00000000 ub2 kubaseq @4220 0x0034 ub1 kubarec @4222 0x37 sb2 ktufbext @4224 4 sb2 ktufbspc @4226 1360 struct ktuxcfbp[3], 12 bytes @4228 struct ktufbuba, 8 bytes @4228 ub4 kubadba @4228 0x00000000 ub2 kubaseq @4232 0x0000 ub1 kubarec @4234 0x00 sb2 ktufbext @4236 0 sb2 ktufbspc @4238 0 struct ktuxcfbp[4], 12 bytes @4240 struct ktufbuba, 8 bytes @4240 ub4 kubadba @4240 0x00000000 ub2 kubaseq @4244 0x0000 ub1 kubarec @4246 0x00 sb2 ktufbext @4248 0 sb2 ktufbspc @4250 0 BBED> BBED> sum apply Check value for File 0, Block 9: current = 0x0000, required = 0x0000 BBED> v DBVERIFY - Verification starting FILE = /u02/PIC/PLHIS/system01.dbf BLOCK = 9 DBVERIFY - Verification complete Total Blocks Examined : 1 Total Blocks Processed (Data) : 0 Total Blocks Failing (Data) : 0 Total Blocks Processed (Index): 0 Total Blocks Failing (Index): 0 Total Blocks Empty : 0 Total Blocks Marked Corrupt : 0 Total Blocks Influx : 0 BBED> |
然后open reset logs 成功启动数据库。