ITPub博客

首页 > 数据库 > 数据库开发技术 > transaction使用的undo block组成了一个单向列表!

transaction使用的undo block组成了一个单向列表!

原创 数据库开发技术 作者:warehouse 时间:2008-07-28 07:06:41 0 删除 编辑
通过试验验证了一下。[@more@]

SQL> insert into tt select * from dba_objects;

已创建40231行。

SQL> select ubafil,ubablk,start_ubablk,used_ublk from v$transaction;

UBAFIL UBABLK START_UBABLK USED_UBLK
---------- ---------- ------------ ----------
2 183 99 19

SQL> select segment_name,extent_id,file_id,block_id from dba_extents where segme
nt_name='RBS1';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID
-------------------- ---------- ---------- ----------
RBS1 0 2 97
RBS1 1 2 169
RBS1 2 2 177
RBS1 3 2 185
RBS1 4 2 193

SQL>

这里的START_UBABLK表示事务使用的undo起始block,而UBABLK表示的是最后一个被使用的undo block,

所有这些block组成了一个从最后一个指向前一个的单向list,在这些block的内部从每一个block的第一

个rec开始下面有一个rdba,这个rdba记录的就是它前面的一个block,我们先dump 一下183(last block

)来看一下:

SQL> alter system dump datafile 2 block 183;

系统已更改。

dump 内容如下:

*-----------------------------
* Rec #0x1 slt: 0x01 objn: 40926(0x00009fde) objd: 41117 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x008000b6

把上面的rdba: 0x008000b6转化为对应的block#:

SQL> select dbms_utility.data_block_address_block(to_number('008000b6','xxxxxxxx
')) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('008000B6','XXXXXXXX'))
-----------------------------------------------------------------------
182

--=================================

再来dump一下extent_id=1的第一个block 169来看看:

SQL> alter system dump datafile 2 block 169;

系统已更改。

dump内容:

*-----------------------------
* Rec #0x1 slt: 0x01 objn: 40926(0x00009fde) objd: 41117 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00800068
*-----------------------------

转化一下:

SQL> select dbms_utility.data_block_address_block(to_number('00800068','xxxxxxxx
')) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('00800068','XXXXXXXX'))
-----------------------------------------------------------------------
104

block#=104的block不正是extent_id=0的最后一个block

--=================================

再来dump一下177看一下:

SQL> alter system dump datafile 2 block 177;

系统已更改。

dump内容:

*-----------------------------
* Rec #0x1 slt: 0x01 objn: 40926(0x00009fde) objd: 41117 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x008000b0
*-----------------------------

转化一下:

SQL> select dbms_utility.data_block_address_block(to_number('008000b0','xxxxxxxx
')) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('008000B0','XXXXXXXX'))
-----------------------------------------------------------------------
176

dump 176:

SQL> alter system dump datafile 2 block 176;

系统已更改。

dump内容:

*-----------------------------
* Rec #0x1 slt: 0x01 objn: 40926(0x00009fde) objd: 41117 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x008000af
*-----------------------------

转化一下:

SQL> select dbms_utility.data_block_address_block(to_number('008000af','xxxxxxxx
')) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('008000AF','XXXXXXXX'))
-----------------------------------------------------------------------
175

最后我们来dump一下这个transaction使用的第一个block 99:

SQL> alter system dump datafile 2 block 99;

系统已更改。

dump内容:

*-----------------------------
* Rec #0x1 slt: 0x00 objn: 0(0x00000000) objd: 0 tblspc: 0(0x00000000)
* Layer: 5 (Transaction Undo) opc: 7 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------

发现它的rdba: 0x00000000

这个0x00000000代表的是不指向任何block还是指向自身?大家自己去理解吧

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19602/viewspace-1007953/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Dynamic Sampling!
请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5366325