对一致性读有了解的朋友都会想看看undo中的内容,所以特写此文作为参考
进入正题:
首先我们修改表中的数据:
Select * from users;
USERID USERNAME
------ --------------------
1 zbcxy
Update set users username=’xiongge’ whereuserid=1;
我们得找到对应的事务,这儿有两种方法:
第一种:
通过v$transaction得到:
select * from v$transaction;
ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN
000007FF712CD238 4 21 1615 3 1085 338
这儿为了方便阅读只贴出部分字段
UBAFIL 和UBABLK字段分别为事务对应文件号,以及块号,所以我们可以直接dump:
Alter system dump datafile 3 block 1085;
根据XIDUSN 我们可以找到对应undo:
select * from v$rollname where usn=4;
USN NAME
---------- ------------------------------
4 _SYSSMU4_1451910634$
这时候我们可以dump undo header:
Alter system dump undo header“_SYSSMU4_1451910634$” ;
第二种方法:
根据当前事务操作的对象,dump 该对象的block,这里不明白的朋友请移步:
http://www.hangger.com/index.php/archives/226
下面我贴出dump block中的事务槽代码:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.021.00000641 0x00c00163.0147.2d C--- 0 scn 0x0000.002e816a
0x02 0x0004.015.0000064f 0x00c0043d.0152.05 ---- 1 fsc 0x0000.00000000
Lck:1 为当前锁定的行,也就是我们正在找的事务
uba:undo blockaddress 第一段是回滚数据块的地址,包括回滚段文件号和数据块号;第二段是回滚序列号;第三段是回滚记录号。
这里我们就取第一段地址:0x00c0043d 将它转换为10进制数,得到:12583997
这儿是绝对地址,我们将其转换为相对地址
select dbms_utility.data_block_address_file(12583997)file#,
dbms_utility.data_block_address_block(12583997) block from dual;
FILE# BLOCK
---------- ----------
3 1085
Ok,你会发现和刚的到的地址是一样
那怎么去得到对应的段呢:
这时候我们需要去看xid了,在dump block中我们已经说到:
xid:事物id,由undo的段号+槽号+事务序列号三部分组成
那么就只需要去第一段地址:0x0004 转换为10进制为:4,当然和v$transaction中的XIDUSN的数字相同。
关于如何dump undo header 和undo block就讲到这儿,下面我们分析dump下来的内容:
首先分析 undo header中的关键内容:
可以看到undo段头块事务表中高亮部分为对应的事务槽(根据state和dba判断,转换为文件号和块号为 3号文件 1085号块,与v$transaction视图中UBAFIL ,UBABLK字段相同 )
State:为10表示active,9表示inactive,2表示存在prepared的悬挂事务。
Dba:为undo块地址,与block中uba第一段地址相同
Scn:systemchange number
下面分析undo block中的关键内容:
undo block和block中的内容大致相同,我们针对不同的字段进行分析:
*-----------------------------
* Rec #0x5 slt: 0x15 objn: 75451(0x000126bb) objd:75451 tblspc: 4(0x00000004)
* 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: 0x00c0043d.0152.01 ctlmax scn: 0x0000.002ec673 prv tx scn: 0x0000.002ec67d
txn start scn: scn:0x0000.00000000 logon user: 84
prev brb: 12583992 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat bit: 4 (post-11)padding: 0
op: Z
KDO Op code: URP rowdependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0100029e hdba: 0x0100029a
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 0(0x0) flag:0x2c lock: 0 ckix: 0
ncol: 2 nnew: 1 size: -2
col 1: [ 5] 7a 62 63 78 79
Rec #0x2e:该undo记录的号码。
Slt:事务表槽号。
Objn:对应数据块对象号。
Tblspc:对应数据块表空间号。
Col:保存前进项值。Ox4c-1=77。
Bdab:数据块地址。 转换为10进制为16777886,转换为相对地址为:4号文件第670号块,与我们操作的表对应的block地址是一样的
Hdba:数据块所在段的段头块。
注意这里的objn:
select * from dba_objectswhere object_id=75451;
OWNER OBJECT_NAME OBJECT_ID
SCOTT USERS 75451
Users表就是我当前操作的表
将数据转换:
select UTL_RAW.CAST_TO_varchar2(replace(' 7a 62 63 78 79 ',' ')) from dual; UTL_RAW.CAST_TO_VARCHAR2(REPLA
--------------------------------------------------------------------------------
Zbcxy
这里是我以前的数据,为什么会这样,将会在深入剖析一致性读中讲到。
先就讨论这么多,以后再对相关属性解释