oracle回滚机制深入研究(五)

2014-11-24 16:16:00 · 作者: · 浏览: 17

uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 10 0x80 0x0004 0x0000 0x0000.00000000 0x01400102 0x0000.000.00000000 0x00000001 0x00000000 0
0x01 9 0x00 0x0003 0x0002 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x02 9 0x00 0x0003 0x0003 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x03 9 0x00 0x0003 0x0004 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
............省略中间一部分................
0x1f 9 0x00 0x0003 0x0020 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x20 9 0x00 0x0003 0x0021 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x21 9 0x00 0x0003 0xffff 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0

回顾我们开始时查询的事务XID信息:xidslot=0(这个事务占用UNDO事务表中第几号事务槽) and xidseq=4 与上面标红的0x00、state=10(代表事务状态为活动)、wrap#=4 完全相符合。
其中dba列值表示包含这个事务的前映像的undo块地址(事务最后更新的前映像UNDO地址),与ITL事务槽中的uba地址一致 ,即file 5,block 258(可使用dbms_utility.data_block_address_file函数转换)

(6)分析UNDO block dump文件
UNDO BLK:
xid: 0x0013.000.00000004 seq: 0x1 cnt: 0x2 irb: 0x2 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset --undo信息偏移量,在undo块中偏移
---------------------------------------------------------------------------
0x01 0x1f58 0x02 0x1ef4 --当前undo块中的最后一个偏移地址即Ox02 与irb一致
其中irb:0x2 表示未提交事务最新(最后执行的)变更对应的undo数据块中的UNDO record地址,如果开始rollback,这是回滚的起点。
*-----------------------------
* Rec #0x1 slt: 0x00 objn: 73424(0x00011ed0) objd: 73424 tblspc: 4(0x00000004) --根据Rec #0x2 中的rci记录找到#0x1
* Layer: 11 (Row) opc: 1 rci 0x00 --rci指针为0,表示这是事务回滚过程中的最后一条记录
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000Ext idx: 0
flg2: 0

*-----------------------------
uba: 0x00000000.0000.00 ctl max scn: 0x0000.000e61e6 prv tx scn: 0x0000.000e61e6
txn start scn: scn: 0x0000.00000000 logon user: 85
prev brb: 0 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat bit: 4 (post-11) padding: 1
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000c3 hdba: 0x010000aa
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 70(0x46) flag: 0x2c lock: 0 ckix: 80 --slot表示更新数据的行序列值(rowno),用于定位具体的数据,与我们查询的一致
ncol: 4 nnew: 1 size: 5
col 3: [ 9] 50 52 4f 43 45 44 55 52 45 ---转换为字符为‘PROCEDURE’,与我们更新前数据一致
转换方法:
SELECT utl_raw.cast_to_varchar2(replace('50 52 4f 43 45 44 55 52 45',' ')) value FROM dual;
*-----------------------------
* Rec #0x2 slt: 0x00 objn: 73424(0x00011ed0) objd: 73424 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x01 --指向REC# 0x01,即上一个偏移量
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: 0x01