ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Data Block Structure -----ITL

Data Block Structure -----ITL

原创 Linux操作系统 作者:ylw66 时间:2009-08-16 13:30:26 0 删除 编辑
想整理一下biti_rainy 对读一致性的步骤的描述,但是很多基本概念还没有搞清楚,just step-on-step
ITL:Intrested Transaction List,必须明确的是ITL是data block上的结构,用来记录该块发生的事务
一个ITL有一条记录,在一个时间,可以记录一个事务(包括提交或者未提交事务)当事务提交以后,该槽位可以被重复的使用。
可以通过dump来看看内部结构
SQL> conn scott/tiger
已连接。
SQL> update dept set dname =lower(dname) where deptno=40;
已更新 1 行。
现在需要知道该变更发生在哪个data file和data block
SQL> select rowid,t.* from dept t where deptno=40;
ROWID                  DEPTNO DNAME          LOC
------------------ ---------- -------------- -------------
AAAHW5AABAAAMUSAAD         40 operations     boston
先获取该行的rowid
SQL> select dbms_rowid.rowid_block_number('AAAHW5AABAAAMUSAAD') from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAAHW5AABAAAMUSAAD') 
---------------------------------------------------
                                              50450  -----data block
SQL> select dbms_rowid.rowid_relative_fno('AAAHW5AABAAAMUSAAD') from dual;
DBMS_ROWID.ROWID_RELATIVE_FNO('AAAHW5AABAAAMUSAAD')
---------------------------------------------------
                                                  1   -----data file
SQL> alter system dump datafile 1 block 50450;
系统已更改。
SQL> @trace_file_name.sql
TRACE_FILE_NAME
------------------------------------------------
d:\oracle\admin\game\udump/game_ora_1344.trc
获取dump文件路径


Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.01d.0000301d  0x00800042.053d.14  ----    1  fsc 0x0000.00000000
0x02   0x0008.017.00003fc2  0x0080192f.06c5.4c  C---    0  scn 0x0000.011b7e62

来观察一下Itl
Transaction id(Xid): 8bytes。
Xid = Undo.Segment.Number+Transaction.Table.Slot.Number+Wrap
SQL> select t.xidusn,xidslot,xidsqn from v$transaction t;
    XIDUSN    XIDSLOT     XIDSQN
---------- ---------- ----------
         1         29      12317
是和v$transaction表中记录吻合的

Undo Segment Number:回顾段号,可以到v$rollname中查到
Transaction Table Slot:事务表上的槽位,以后会详细介绍Transaction Table
Wrap: 由于回滚段是循环覆盖使用的,wrap 指 回滚段被循环覆盖使用了几圈。 因为光靠事务表中槽位来定位 回滚信息是不充分的,假如回滚段事务表被循环覆盖N圈 你必须要识别是不是刚好这一轮的


Undo block address(Uba): 8bytes。
uba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry.in.UNDO.Record.Map,uba 是定位到具体的回滚段块的,事务的回滚信息在回滚段中是一个单向链表,header 就是最后使用的block,正好从这个表头往前就可以按照从后往前的顺序去做undo。以后来分析下Undo的内存结构

Flags: 1nibble。半个字节,4位
---- = transaction is active, or committed pending cleanout
C--- = transaction has been committed and locks cleaned out 
-B-- = this undo record contains the undo for this ITL entry
--U- = transaction committed (maybe long ago); SCN is an upper bound
---T = transaction was still active at block cleanout SCN

Locks: 3nibbles,3个半字节. 也就是所谓的行级锁(row-level locks)

SCN or free space credit: 6bytes.还不明白什么意思

itl的个数,受参数initrans控制,最大的itl个数,受maxtrans控制,在一个块内部,默认分配了2个或3个itl的个数。一个data block的free space如果有空间,当满足maxtrans控制的情况下,会自动的扩展ITL

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

请登录后发表评论 登录
全部评论

注册时间:2009-07-29

  • 博文量
    57
  • 访问量
    94430