oracle回滚机制的深入探究(四)

2014-11-24 09:44:39 · 作者: · 浏览: 4
01 0x1f08 0x02 0x1e58 0x03 0x1df4 0x04 0x1da0 0x05 0x1d1c
0x06 0x1ca0 0x07 0x1c54 0x08 0x1b80 0x09 0x1afc 0x0a 0x1a70
0x0b 0x198c 0x0c 0x1924 0x0d 0x18cc 0x0e 0x17e8 0x0f 0x1780
0x10 0x1728 0x11 0x16a8 0x12 0x1650 0x13 0x15f4 0x14 0x1598
www.2cto.com
*-----------------------------
注意,这部分信息有个参数irb: 0x14。irb指的是回滚段中记录的最近所有未提交的事务的开始之处,也就是最近一次被修改的地方,如果要回滚,这便是回滚的起点。
由上,可知:(irb: 0x14)的偏移地址为0x1598
找到irb:0x14信息,如下:
[sql]
*-----------------------------
* Rec #0x14 slt: 0x1a objn: 51148(0x0000c7cc) objd: 51148 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x13
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
op: C uba: 0x00800615.0105.13
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x01000020 hdba: 0x0100001b
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 5(0x5) flag: 0x2c lock: 0 ckix: 191
ncol: 8 nnew: 1 size: 1
col 5: [ 3] c2 1d 33
c2 1d 33转换为10进制就是2850.这是最后被更新的记录的旧值。也就是update emp set sal=4000 where empno=7698。 www.2cto.com
注意,这里有几个参数需要关注:
1)参数rci 0x13,该参数代表的就是undo chain(同一个事务中的多次修改,根据chain链接关联),此处的rci 0x13指向第二次修改update emp set sal=4000 where empno=7782.此时,如果有其他进程查询scott.emp表,则oracle需要构造一致性读来把数据展现给用户。
2)参数bdba: 0x01000020,该参数代表旧值对应的数据块的地址,下面把这个参数翻译出来:
[sql]
scott@ORCL> select to_number('01000020','xxxxxxxx') from dual;
TO_NUMBER('01000020','XXXXXXXX')
--------------------------------
16777248
scott@ORCL> select dbms_utility.data_block_address_file(16777248) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16777248)
----------------------------------------------
4
scott@ORCL> select dbms_utility.data_block_address_block(16777248) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16777248)
-----------------------------------------------
32
再将4号文件的第32个块dump出来:
[sql]
sys@ORCL> select spid from v$process where addr in (select paddr from v$session
2 where sid in (select sid from v$mystat where rownum=1));
www.2cto.com
SPID
------------
13929
sys@ORCL> alter system dump datafile 4 block 32;
System altered.
部分内容摘入如下:
[sql]
Start dump data blocks tsn: 4 file#: 4 minblk 32 maxblk 32
buffer tsn: 4 rdba: 0x01000020 (4/32)
scn: 0x0000.000d36d2 seq: 0x01 flg: 0x04 tail: 0x36d20601
frmt: 0x02 chkval: 0xa9ea type: 0x06=trans data
Block header dump: 0x01000020
Object id on Block Y
seg/obj: 0xc7cc csc: 0x00.b9cf3 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000019 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.011.000000f2 0x00805794.00c8.49 C--- 0 scn 0x0000.0006bfdb
0x02 0x0009.01a.00000162 0x00800615.0105.14 ---- 3 fsc 0x0002.00000000
www.2cto.com
这里存在ITL事务槽信息,事务必须得到一个ITL事务槽才能够进行数据修改。ITL内容主要包括xid(指向回滚段头的ITL)、uba(指向回滚块)、Lck(行头锁的个数,此处修改三次,故有3个锁)。在以上输出中,可知:itl2(0x02)上存在活动事务。
将xid(0x0009.01a.00000162)分解