Oracle undo镜像数据探究(四)
1 0x00000000 1376806203
0x0a 9 0x00 0x0059 0x001f 0x0000.009b9479 0x020005d5 0x0000.000.00000000 0x00000001 0x00000000 1376806707
0x0b 9 0x00 0x0059 0x001a 0x0000.009b92fc 0x020005d3 0x0000.000.00000000 0x00000001 0x00000000 1376806203
0x0c 9 0x00 0x0059 0x0004 0x0000.009b92c3 0x020005d3 0x0000.000.00000000 0x00000001 0x00000000 1376806203
可以看到在事务表中0x07正是第七个slot,把dba转为2进制,在转为10进制,可以打出数据文件号为8,数据块为1493,这正是数据的前镜像。
4)我们已经在 undo header中找到了数据的前镜像,那么我们在看一下这个前镜像到底是什么?
摘录数据文件信息如下:
********************************************************************************
UNDO BLK:
xid: 0x000c.007.0000005a seq: 0x33a cnt: 0x27 irb: 0x27 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset
---------------------------------------------------------------------------
0x01 0x1f4c 0x02 0x1ec4 0x03 0x1db0 0x04 0x1d3c 0x05 0x1cb8
0x06 0x1c4c 0x07 0x1be8 0x08 0x1b94 0x09 0x1aec 0x0a 0x1a4c
0x0b 0x19ac 0x0c 0x1900 0x0d 0x1854 0x0e 0x17ac 0x0f 0x171c
0x10 0x167c 0x11 0x15d4 0x12 0x1544 0x13 0x14a4 0x14 0x13f8
0x15 0x139c 0x16 0x1328 0x17 0x128c 0x18 0x117c 0x19 0x1114
0x1a 0x10bc 0x1b 0x1068 0x1c 0x100c 0x1d 0x0f98 0x1e 0x0f3c
0x1f 0x0ee8 0x20 0x0e60 0x21 0x0dd4 0x22 0x0d6c 0x23 0x0cd0
0x24 0x0c2c 0x25 0x0bb0 0x26 0x0b50 0x27 0x0ad4
可以看到数据记录为39,这是第一条,并且最后一个偏移量也为39,这正是rollback的开始。
*-----------------------------
* Rec #0x27 slt: 0x07 objn: 73229(0x00011e0d) objd: 73229 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x26
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat bit: 4 (post-11) padding: 1
op: C uba: 0x020005d5.033a.26
Array Update of 1 rows:
tabn: 0 slot: 109(0x6d) flag: 0x2c lock: 0 ckix: 0
ncol: 18 nnew: 1 size: 0
KDO Op code: 21 row dependencies Disabled
xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x0041e7f4 hdba: 0x00414908
itli: 1 ispac: 0 maxfr: 4863
vect = 8
col 3: [ 5] 52 48 59 53 33
好了,既然找到了,那么我们看一下这条record记录了是数据的是什么.
前镜像为:RHYS3
SQL>
这是最后一条SQL> update t set name='rhys4' where obj#=29;的前镜像。因为 开始部分是从倒叙的,因此,我们在看倒数第二条。
*-----------------------------
* Rec #0x26 slt: 0x07 objn: 73229(0x00011e0d) objd: 73229 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x25
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: 0x020005d5.033a.25
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0041e7f4 hdba: 0x00414908
itli: 1 ispac: 0 maxfr: 4863
tabn: 0 slot: 108(0x6c) flag: 0x2c lock: 0 ckix: 0
ncol: 18 nnew: 1 size: 1
col 3: [ 6] 52 48 59 53 32 30
前镜像为:
SQL> select utl_raw.cast_to_varchar2(replace('52 48 59 53 32 30',' ') ) nam from dual;
NAM
--------------------------------------------------------------------------------
RHYS20
SQL>
第三条语句:
*-----------