【event】tx:allocate ITL entry

来源:互联网 发布:学完c语言 编辑:程序博客网 时间:2024/05/18 03:20
ITL(Interested Transaction List),也叫事务槽,是存储在数据块头部的一部分记录对该数据库进行操作的事务的信息。其格式如下


Itl为事务槽编号,1,2,3,4……
Xid为事务槽记录的事务信息。以点分割,分别对应v$transaction中的XIDUSN、XIDSLOT、XIDSQN。
Uba为事务槽记录的undo信息。以点分割,分别对应v$transaction中的UBABLK、UBASQN、UBAREC。(UBAFIL?)
Flag为---- 表示transaction is active, or committed pending cleanout,
    C--- 表示事务已经提交并且持有的锁已经清除;-
         -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
    lck:事务锁住了几行数据。


下面具体说下v$transaction中的字段解释


XIDUSN,Undo segment number,与v$rollname中的usn对应。
XIDSLOT,Slot number。在undo segment头部中,维护了一个事务表,slot number即为表中的槽号。
XIDSQN,Sequence number。事务表中的该事务槽被重用的次数。
UBAFIL,Undo block address (UBA) filenum。事务对应的undo信息的文件号。
UBABLK,UBA block number。事务对应的undo信息的块号。
UBASQN,UBA sequence number.该undo块被重用的次数。
UBAREC,UBA record number.该事务对应的undo信息存放在块中的记录号。


可以通过以下语句dump undo_segment段头,从里面可以找到对应的undo slot number和sequence number。
  alter system dump undo header "_SYSSMU6_1263032392$";
可以通过dump数据块,找到里面对应的记录信息,以及undo里面存储的修改前的值。
alter system dump datafile 3 block 212;


tx:allocate ITL entry
这个等待事件就是需要额外的ITL的时候,却没有足够的空间来分配事务槽,所以只能等待。等待有足够的空间,或者占用ITL的会话释放占用。


怎么会造成事务槽不够呢?
1、基本上就是初始时候分配一定数量,最大分配255个,只要有空间,就能在255的限制范围内持续分配。所以事务槽不够,只能说块内没空间了。
2、超过255上限了。


ITL的数量
一个事务槽占用24bytes空间。
ITL的数量受到几个参数的限制。
initrans
在建表的时候制定initrans参数,指定每个块中提前建立多少个事务槽,默认会建立两个。
255(maxtrans)
原本有个maxtrans参数限制最大事务槽数,10g/11g的版本中这个设置已不生效。
在事务槽不够的情况下只要块中还有空间,就能分配新的事务槽。但是最大不能超过255.
其实ITL slot占用空间不能超过块大小的50%,因此8K的块最多有169个。
pctfree
刚刚说过了,只要块中有空间,就能一直分配事务槽。而pctfree就影响了块中的可用剩余空间。
pctused在ASSM中已经不再生效。


解决方案:
1、重建表,指定更大的initrans值(提前把空间占了)。
2、重建表,指定更大的pctfree值(使空有更多空间,也使块中可存储的数据行变少,也可以一定程度较小热点块)。
3、修改事务,commit更频繁,解决达到事务槽上限。


验证就好说了,建表制定pctfree为0,插入一定数据,把一个数据块填满,然后更新该数据块上的行,一般update几行就能出现
tx:allocate ITL entry等待。可以bbed查看块剩余空间,处于24就知道能分配多少itl了。
0 0
原创粉丝点击