[20150721]enq TX - allocate ITL entry

[20150721]enq TX - allocate ITL entry.txt

--昨天我做了一个测试链接:
http://blog.itpub.net/267265/viewspace-1742243/
--本想通过这个例子说明为什么8K数据块Hakan Factor=736?

--晚上我想到一种这种特殊的表会不会产生enq TX - allocate ITL entry,也就是itl不足的情况。

1.建立测试环境:
SCOTT@test> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

SCOTT@test> drop table test purge ;
Table dropped.

SCOTT@test> create table test (id varchar2(100)) pctfree 0 tablespace mssm ;
Table created.

SCOTT@test> insert into test select null from dba_objects where rownum<=1000;
1000 rows created.

SCOTT@test> commit ;
Commit complete.

SCOTT@test> select rowid,test.* from test where rownum<=1;
ROWID              ID
------------------ --------------------
AAAQazAAGAAAAAKAAA

SCOTT@test> alter system checkpoint;
System altered.

SCOTT@test> @ &r/lookup_rowid AAAQazAAGAAAAAKAAA
      OBJECT         FILE        BLOCK          ROW DBA                  TEXT
------------ ------------ ------------ ------------ -------------------- ----------------------------------------
       67251            6           10            0 6,10                 alter system dump datafile 6 block 10 ;

2.通过bbed观察:
BBED> set dba 6,10
        DBA             0x0180000a (25165834 6,10)

BBED> map
File: /mnt/ramdisk/test/mssm01.dbf (6)
Block: 10                                    Dba:0x0180000a
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes                      @0
struct ktbbh, 72 bytes                     @20
struct kdbh, 14 bytes                      @92
struct kdbt[1], 4 bytes                    @106
sb2 kdbr[734]                              @110
ub1 freespace[4381]                        @1578
ub1 rowdata[2229]                          @5959
ub4 tailchk                                @8188

--可以发现freespace=4381, sb2 kdbr[734] 也说明插入了734条记录。还有大量的空间。

3.昨天我的测试如果即使做这样的修改也会出现行迁移的情况:
--但是如果我打开3个会话,修改同一块里面不同记录会出现什么情况呢?

--session 1:
SCOTT@test> @ &r/spid

         SID      SERIAL# SPID   C50
------------ ------------ ------ --------------------------------------------------
         139          953 19894  alter system kill session '139,953' immediate;

SCOTT@test> update test set id='12345' where rowid='AAAQa0AAGAAAAAKAAA' ;
1 row updated.
--不提交。

--session 2:
SCOTT@test> @ &r/spid

         SID      SERIAL# SPID   C50
------------ ------------ ------ --------------------------------------------------
         147         1493 19921  alter system kill session '147,1493' immediate;

SCOTT@test> update test set id='12345' where rowid='AAAQa0AAGAAAAAKAAB' ;
1 row updated.
--不提交。

--session 3:
SCOTT@test> @ &r/spid

         SID      SERIAL# SPID   C50
------------ ------------ ------ --------------------------------------------------
         137           61 19933  alter system kill session '137,61' immediate;

SCOTT@test> update test set id='12345' where rowid='AAAQa0AAGAAAAAKAAC' ;
--挂起。

4.通过bbed观察:
SCOTT@test> alter system checkpoint;
System altered.

SCOTT@test> select * from V$SESSION_EVENT where sid in (137,139,147);

SID EVENT                           TOTAL_WAITS TOTAL_TIMEOUTS  TIME_WAITED AVERAGE_WAIT     MAX_WAIT TIME_WAITED_MICRO     EVENT_ID WAIT_CLASS_ID  WAIT_CLASS# WAIT_CLASS
---- ------------------------------ ------------ -------------- ------------ ------------ ------------ ----------------- ------------ ------------- ------------ --------------------
137 enq: TX - allocate ITL entry             37             36        10382       280.58          293         103815779    281768874    3290255840            2 Configuration
137 SQL*Net message to client                15              0            0            0            0                 9   2067390145    2000153315            7 Network
137 SQL*Net message from client              15              0         1976       131.71         1291          19755790   1421975091    2723168908            6 Idle
137 SQL*Net break/reset to client             1              0            0          .02            0               168   1963888671    4217450380            1 Application
139 SQL*Net message to client                18              0            0            0            0                15   2067390145    2000153315            7 Network
139 SQL*Net message from client              17              0        13099       770.52        10422         130988660   1421975091    2723168908            6 Idle
139 SQL*Net break/reset to client             2              0            0          .01            0               191   1963888671    4217450380            1 Application
147 SQL*Net message to client                15              0            0            0            0                10   2067390145    2000153315            7 Network
147 SQL*Net message from client              14              0         1381        98.67          940          13813684   1421975091    2723168908            6 Idle
9 rows selected.

--可以发现出现"enq: TX - allocate ITL entry" 等待事件。

BBED> set dba 6,10
        DBA             0x0180000a (25165834 6,10)

BBED> map
File: /mnt/ramdisk/test/mssm01.dbf (6)
Block: 10                                    Dba:0x0180000a
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes                      @0
struct ktbbh, 72 bytes                     @20
struct kdbh, 14 bytes                      @92
struct kdbt[1], 4 bytes                    @106
sb2 kdbr[734]                              @110
ub1 freespace[4390]                        @1578
ub1 rowdata[2220]                          @5968
ub4 tailchk                                @8188
--freespace=4390!!竟然出现itl槽不足的情况。

BBED> p *kdbr[0]
rowdata[9]
----------
ub1 rowdata[9]                              @5977     0x20

BBED> x /rc
rowdata[9]                                  @5977
----------
flag@5977: 0x20 (KDRHFH)
lock@5978: 0x02
cols@5979:    0
nrid@5980:0x0180000b.10a

BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0]                              @5968     0x20

BBED> x /rc
rowdata[0]                                  @5968
----------
flag@5968: 0x20 (KDRHFH)
lock@5969: 0x01
cols@5970:    0
nrid@5971:0x0180000b.10b

BBED> p *kdbr[2]
rowdata[1461]
-------------
ub1 rowdata[1461]                           @7429     0x2c

BBED> x /rc
rowdata[1461]                               @7429
-------------
flag@7429: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7430: 0x00
cols@7431:    0

--可以发现前面2条记录出现了行迁移。从另外的方面证明我的猜测,oracle必须为可能出现的行迁移保留必要的自由空间,即使在这种
--情况有许多自由空间,oracle依旧报itl槽不足。当然这种情况在实际中非常难出现。两种可能合在一起再做update也许会出现:
1.每条记录很短。
2.pctfree设置很小=0.

 

--另外说明一个很有兴趣的测试,如果你等上1段时间,比如2,3分钟,然后在会话2提交,各位继续观察,可以发现会话3还是依旧无法提交。

--出现的依旧是enq: TX - allocate ITL entry等待。视乎是会话3仅仅在等会话1提交,如果你会话1提交,会话3才会解除挂起状态。

--有兴趣看链接:http://blog.itpub.net/267265/viewspace-731657/,当然这个问题出现10.2.0.4。

时间: 2024-09-20 13:37:18

[20150721]enq TX - allocate ITL entry的相关文章

【MOS】 Troubleshooting waits for enq: TX - allocate ITL entry(1472175.1)

Troubleshooting waits for 'enq: TX - allocate ITL entry' (文档 ID 1472175.1) In this Document Symptoms Cause Solution   Increase INITRANS   Increase PCTFREE   A Combination of increasing both INITRANS and PCTFREE References APPLIES TO: Oracle Database

关于enq: TX - allocate ITL entry的问题分析

今天发现系统在下午1点左右的时候负载比较高,就抓取了一个最新的awr报告. Snap Id Snap Time Sessions Cursors/Session Begin Snap: 20892 26-Nov-14 13:20:17 3623 5.4 End Snap: 20893 26-Nov-14 13:30:17 3602 5.4 Elapsed:   10.01 (mins)     DB Time:   365.56 (mins)     来看看是否有top的等待事件,对于其它的几个

oracle数据库enq: TX - allocate ITL entry性能诊断

朋友公司的某铁路集团医保系统出现性能问题业务不能正常办理,下面是出现性能问题时的awr报告 从等待事件来看主要是出现了多处锁竞争.其中enq: TX - allocate ITL entry等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作同时操作相同的数据块或索引块就会出现这个等待事件,可以通过查看Segments by ITL Waits部分的信息来了解出现大量并发DML操作的对象 从下面的信息可以看出消耗时间最长的语句都是

【故障处理】队列等待之TX - allocate ITL entry案例

[故障处理]队列等待之TX - allocate ITL entry案例 1  BLOG文档结构图       2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① enq: TX - allocate ITL entry等待事件的解决 ② 一般等待事件的解决办法 ③ 队列等待的基本知识 Tips: ① 本文在ITpub(http://blog.itpub.net/26736162).博客园(ht

[20140130]关于enq TX-allocate ITL entry

  昨天遇到一例enq TX - allocate ITL entry等待事件,就是维护人员打开多个会话更新一个表的某个字段,开始以为等待与undo有关,查 看才发现是"enq TX - allocate ITL entry",因为没有业务操作,建议修改为ctas来建立新表,建立相关索引,然后改名完成操作. 实际上,一般正常的业务操作,很少遇到这个等待事件,如果出现一般是pctfree设置太小或者由于记录程度增大,导致pctfree减少,以及块 上事务太多而导致问题. 做一个简单的比喻

ORACLE 归档空间满导致的enq: TX - row lock contention

  2016年10月10日,客户一预警系统发生会话数飙高,系统响应极慢,后来确诊根源是归档空间满,引起所有redo耗尽,导致会话堆积,下面是处理过程.  操作系统:HP-UX B.11.31 U ia64  数据库版本:ORACLE 10.2.0.5 RAC  按照常规处理思路,首先查看RAC数据库的告警日志:  实例1的告警日志 Mon Oct 10 19:24:48 EAT 2016 ORACLE Instance orcl1 - Can not allocate log, archival

ORACLE等待事件:enq: TX - row lock contention

enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO).enq: TX - row lock contention等待事件,OACLE将其归类为application级别的等待事件.有些场景是因为应用逻辑设计不合理造成的.下面我们看看enq: TX - row lock contention的英文介绍: This wait indicates ti

ORACLE AWR结合ASH诊断分析enq: TX - row lock contention

  公司用户反馈一系统在14:00~15:00(2016-08-16)这个时间段反应比较慢,于是生成了这个时间段的AWR报告,   如上所示,通过Elapsed Time和DB Time对比分析,可以看出在这段时间内服务器并不繁忙.分析Top 5 Timed Events,我们可以看到前五的等待事件     可以看到等待事件enq: TX - row lock contention占了所有等待事件17.3%的比例,猜测有可能是锁等待(enqueue等待)引起的阻塞导致,但是这个还不能下定论,因为

20161208理解enq TX - row lock contention

[20161208]理解enq TX - row lock contention.txt >SELECT * FROM v$event_name WHERE name = 'enq: TX - row lock contention'; EVENT#   EVENT_ID NAME                          PARAMETER1  PARAMETER2      PARAMETER3 WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS ------