how to dump undo header and block

来源:互联网 发布:阿里云服务器架设sf 编辑:程序博客网 时间:2024/06/05 03:27

对一致性读有了解的朋友都会想看看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

 

这里是我以前的数据,为什么会这样,将会在深入剖析一致性读中讲到。

先就讨论这么多,以后再对相关属性解释

 

 

原创粉丝点击