1. 首页
  2. IT资讯

关于UNDO 内部一致性读和回滚依赖的UNDO CHAIN描述

首先说明一下UNDO里面会形成一个从最后一条记录到第一条记录的一个反向链表,为什么要这样是因为
当我们把记录A修改为B然后又修改为C后,我们需要先找到C的UNDO修改为B,然后找到B的UNDO修改为A
这样才能按照顺序进行回滚。
这样的构架能够满足一致性读和回滚操作。
如下我做了一个
SQL> delete test123123;
34 rows deleted
首先找到这个语句修改了那个块或者那些块,提取其中一个即可。
我这里修改的是file 1的块92025,所以我们DUMP出来看一下
alter system dump datafile 1 block 92025;
找到其中的ITL
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0xffff.000.00000000  0x00000000.0000.00  C—    0  scn 0x0000.00233217
0x02   0x0009.020.000004f5  0x00c00d16.014b.1f  —-   35  fsc 0x0f45.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  —-    0  fsc 0x0000.00000000

根据这个ITL我们可以清楚看到这个事物使用了ITL 0x02,关于如何看ITL请看如下文章,关于ITL中的解释
http://blog.itpub.net/7728585/viewspace-1709334/
这里我们得到了TRANSACTION TABLE中的SLT位置
0x0009.020.000004f5
同时我们得到了这个事物修改的最后一个UBA的位置
0x00c00d16.014b.1f

如此我们DUMP UNDO SEGNMENT 9的UNDO HEADER,以及UBA中DBA 00c00d16进行查看
使用DUMP命令
alter system dump datafile 3 block 3350;
alter system dump undo header ‘_SYSSMU9_3945653786$’;

如下:
UNDO HEADER中的TRANSACTION表

  TRN CTL:: seq: 0x014b chd: 0x0014 ctl: 0x0015 inc: 0x00000000 nfb: 0x0000
            mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
            uba: 0x00c00d15.014b.36 scn: 0x0000.002686ea
…….
  TRN TBL::
 
  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt
  ————————————————————————————————
  …….
   0x1e    9    0x00  0x04f3  0x0017  0x0000.00268f75  0x00c00d14  0x0000.000.00000000  0x00000001   0x00000000  1429116355
   0x1f    9    0x00  0x04f3  0x000a  0x0000.002694a3  0x00c00d15  0x0000.000.00000000  0x00000001   0x00000000  1429117555
   0x20   10    0x80  0x04f5  0x0002  0x0000.00000000  0x00c00d16  0x0000.000.00000000  0x00000002   0x00000000  0
   0x21    9    0x00  0x04f4  0x001c  0x0000.0026954d  0x00c00d15  0x0000.000.00000000  0x00000001   0x00000000  1429117555

这里观察SLT 0X20 这正是我们正在使用的SLT槽
这部分也可以查看http://blog.itpub.net/7728585/viewspace-1709334/进行了解

然后查看0x00c00d16.014b.1f所指向的UNDO,由于篇幅问题我截取其中第一个REC和最后一个REC,及KTUBH
UNDO BLK:  
xid: 0x0009.020.000004f5  seq: 0x14b cnt: 0x1f  irb: 0x1f  icl: 0x0   flg: 0x0000
 
 Rec Offset      Rec Offset      Rec Offset      Rec Offset      Rec Offset
—————————————————————————
0x01 0x1f04     0x02 0x1e20     0x03 0x1d28     0x04 0x1c2c     0x05 0x1bc8     
0x06 0x1acc     0x07 0x19d4     0x08 0x18dc     0x09 0x17e4     0x0a 0x16e0     
0x0b 0x15e8     0x0c 0x14ec     0x0d 0x13f0     0x0e 0x12f4     0x0f 0x11fc     
0x10 0x1104     0x11 0x1010     0x12 0x0f18     0x13 0x0e24     0x14 0x0d28     
0x15 0x0c30     0x16 0x0b2c     0x17 0x0a34     0x18 0x093c     0x19 0x0840     
0x1a 0x0744     0x1b 0x064c     0x1c 0x0558     0x1d 0x0458     0x1e 0x0350     
0x1f 0x0248     

*—————————–
* Rec #0x1  slt: 0x20  objn: 76757(0x00012bd5)  objd: 76757  tblspc: 0(0x00000000)
*       Layer:  11 (Row)   opc: 1   rci 0x00   
Undo type:  Regular undo   Last buffer split:  No 
Temp Object:  No 
Tablespace Undo:  No 
rdba: 0x00c00d15
*—————————–
KDO undo record:
KTB Redo 
op: 0x02  ver: 0x01  
compat bit: 4 (post-11) padding: 1
op: C  uba: 0x00c00d15.014b.39
KDO Op code: IRP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x00416779  hdba: 0x00416778
itli: 2  ispac: 0  maxfr: 4863
tabn: 0 slot: 4(0x4) size/delt: 101
fb: –H-FL– lb: 0x0  cc: 15
null:
01234567890123456789012345678901234567890123456789012345678901234567890123456789
–N-N——N—
col  0: [ 8]  54 45 53 54 44 55 4d 50
col  1: [ 2]  c1 56
col  2: *NULL*
col  3: [ 4]  4f 50 45 4e
col  4: *NULL*
col  5: [ 7]  78 73 09 0a 08 0a 3b
col  6: [ 5]  55 53 45 52 53
col  7: [ 4]  54 45 4d 50
col  8: [ 7]  78 73 03 0e 08 0a 3b
col  9: [ 7]  44 45 46 41 55 4c 54
col 10: [22]
 44 45 46 41 55 4c 54 5f 43 4f 4e 53 55 4d 45 52 5f 47 52 4f 55 50
col 11: *NULL*
col 12: [ 8]  31 30 47 20 31 31 47 20
col 13: [ 1]  4e
col 14: [ 8]  50 41 53 53 57 4f 52 44

…………………

*—————————–
* Rec #0x1f  slt: 0x20  objn: 76757(0x00012bd5)  objd: 76757  tblspc: 0(0x00000000)
*       Layer:  11 (Row)   opc: 1   rci 0x1e   
Undo type:  Regular undo   Last buffer split:  No 
Temp Object:  No 
Tablespace Undo:  No 
rdba: 0x00000000
*—————————–
KDO undo record:
KTB Redo 
op: 0x02  ver: 0x01  
compat bit: 4 (post-11) padding: 1
op: C  uba: 0x00c00d16.014b.1e
KDO Op code: IRP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x00416779  hdba: 0x00416778
itli: 2  ispac: 0  maxfr: 4863
tabn: 0 slot: 33(0x21) size/delt: 133
fb: –H-FL– lb: 0x0  cc: 15
null:
01234567890123456789012345678901234567890123456789012345678901234567890123456789
–N——–N—
col  0: [21]
 53 50 41 54 49 41 4c 5f 57 46 53 5f 41 44 4d 49 4e 5f 55 53 52
col  1: [ 2]  c1 43
col  2: *NULL*
col  3: [16]  45 58 50 49 52 45 44 20 26 20 4c 4f 43 4b 45 44
col  4: [ 7]  78 6f 09 11 0b 0a 29
col  5: [ 7]  78 6f 09 11 0b 0a 29
col  6: [ 5]  55 53 45 52 53
col  7: [ 4]  54 45 4d 50
col  8: [ 7]  78 6f 09 11 0b 0a 29
col  9: [ 7]  44 45 46 41 55 4c 54
col 10: [22]
 44 45 46 41 55 4c 54 5f 43 4f 4e 53 55 4d 45 52 5f 47 52 4f 55 50
col 11: *NULL*
col 12: [ 8]  31 30 47 20 31 31 47 20
col 13: [ 1]  4e
col 14: [ 8]  50 41 53 53 57 4f 52 44
 
先来看看KTUBH

xid: 0x0009.020.000004f5  seq: 0x14b cnt: 0x1f  irb: 0x1f  icl: 0x0   flg: 0x0000
 
 Rec Offset      Rec Offset      Rec Offset      Rec Offset      Rec Offset
—————————————————————————
0x01 0x1f04     0x02 0x1e20     0x03 0x1d28     0x04 0x1c2c     0x05 0x1bc8     
0x06 0x1acc     0x07 0x19d4     0x08 0x18dc     0x09 0x17e4     0x0a 0x16e0     
0x0b 0x15e8     0x0c 0x14ec     0x0d 0x13f0     0x0e 0x12f4     0x0f 0x11fc     
0x10 0x1104     0x11 0x1010     0x12 0x0f18     0x13 0x0e24     0x14 0x0d28     
0x15 0x0c30     0x16 0x0b2c     0x17 0x0a34     0x18 0x093c     0x19 0x0840     
0x1a 0x0744     0x1b 0x064c     0x1c 0x0558     0x1d 0x0458     0x1e 0x0350     
0x1f 0x0248     

这里首先记录修改这个UNDO BLOCK的 XID,一个UNDO BLOCK同时只能由一个TRANSACTION进行修改,所以可以说XID是唯一,他正是
我修改语句的事物。SEQ记录了这个块SEQ,这个在以前的文章中也有解释http://blog.itpub.net/7728585/viewspace-1709334/
简单的说每次修改都会增加1,接下来是cnt就是包含的记录数,然后是IRB通常他指向最后一条记录

然后看看我们的最后一条记录 0x1f:
*—————————–
* Rec #0x1f  slt: 0x20  objn: 76757(0x00012bd5)  objd: 76757  tblspc: 0(0x00000000)
*       Layer:  11 (Row)   opc: 1   rci 0x1e   
Undo type:  Regular undo   Last buffer split:  No 
Temp Object:  No 
Tablespace Undo:  No 
rdba: 0x00000000
*—————————–
这部分我们称为KTUBU,
rec # 不用解释就是记录的排序
SLT 就是我们在UNDO HEADER里面TRANSACTION TABLE的槽号
objn:OBJECT_ID
objd:DATA_OBJECT_ID
两者有一定的区别OBJECT_ID是不变的,DATA_OBJECT_ID是可变的每次TRUNCATE都会变动一次
rci:是一个重要的指针,他指向前一条回滚记录,undo chain的重要组成成员
rdba:如果前一个UNDO记录不在同一块中指向前一个UNDO BLOCK,通常在第一条REC 出现,此时RCI为0
关于RCI和RDBA我们看一下DUMP出来的第一条记录中的值
rci 0x00   
rdba: 0x00c00d15
这里可以看到这个块这并不是这个事物的全部块,他还有部分记录在0x00c00d15中。
如此我们进行0x00c00d15块的DUMP,在这块中我们找到本事物的第一个UNDO REC

*—————————–
* Rec #0x36  slt: 0x20  objn: 76757(0x00012bd5)  objd: 76757  tblspc: 0(0x00000000)
*       Layer:  11 (Row)   opc: 1   rci 0x00   
Undo type:  Regular undo    Begin trans    Last buffer split:  No 
Temp Object:  No 
Tablespace Undo:  No 
rdba: 0x00000000Ext idx: 0
flg2: 0
*—————————–
uba: 0x00c00d15.014b.35 ctl max scn: 0x0000.002686e0 prv tx scn: 0x0000.002686ea
txn start scn: scn: 0x0000.00000000 logon user: 0
 prev brb: 12586260 prev bcl: 0
KDO undo record:
KTB Redo 
op: 0x03  ver: 0x01  
compat bit: 4 (post-11) padding: 1
op: Z
KDO Op code: IRP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x00416779  hdba: 0x00416778
itli: 2  ispac: 0  maxfr: 4863
tabn: 0 slot: 0(0x0) size/delt: 83
fb: –H-FL– lb: 0x0  cc: 15
null:
01234567890123456789012345678901234567890123456789012345678901234567890123456789
–N-N——N—
col  0: [ 3]  53 59 53
col  1: [ 1]  80
col  2: *NULL*
col  3: [ 4]  4f 50 45 4e
col  4: *NULL*
col  5: [ 7]  78 73 06 01 06 0b 1a
col  6: [ 6]  53 59 53 54 45 4d
col  7: [ 4]  54 45 4d 50
col  8: [ 7]  78 6f 09 11 0a 2f 17
col  9: [ 7]  44 45 46 41 55 4c 54
col 10: [ 9]  53 59 53 5f 47 52 4f 55 50
col 11: *NULL*
col 12: [ 8]  31 30 47 20 31 31 47 20
col 13: [ 1]  4e
col 14: [ 8]  50 41 53 53 57 4f 52 44

我们可以比较一下这里
*—————————–
* Rec #0x36  slt: 0x20  objn: 76757(0x00012bd5)  objd: 76757  tblspc: 0(0x00000000)
*       Layer:  11 (Row)   opc: 1   rci 0x00   
Undo type:  Regular undo    Begin trans    Last buffer split:  No 
Temp Object:  No 
Tablespace Undo:  No 
rdba: 0x00000000Ext idx: 0
flg2: 0

包含了重要信息Begin trans,并且RCI和RDBA均为0代表他没有上一个UNDO REC#因为他就是开始
如此我们就形成了一个链表,并且知道了开始和结束的的UNDO REC#,这样一个事物的一致性读和
回滚也就变得理所应当了。最后给出ORACLE的一个undo chain的图如下:

 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-1724306/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:深沉的少年,转转请注明出处:http://www.cxybcw.com/183386.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code