您现在的位置是:首页 >学无止境 >一次oracle环境 enq: TX - allocate ITL entry锁问题分析网站首页学无止境

一次oracle环境 enq: TX - allocate ITL entry锁问题分析

Yushan Bai 2024-06-17 11:28:01
简介一次oracle环境 enq: TX - allocate ITL entry锁问题分析
  1. enq: TX - allocate ITL entry锁问题分析

 

通过分析问题时间段两个节点的AWR报告,TOP1等待为锁竞争enq: TX - allocate ITL entry该等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作的数据行处于相同的数据块或索引块就会出现这个等待事件(即每当一个事务需要修改一个数据块时,需要在数据块头部获得一个可用的ITL槽,其中记录了当前事务的id,使用的undo数据块,还有对应的scn,事务是否提交等信息需要额外的空间当大量SQL同时对一个块进行操作时,对ITL槽的需求更大,当ITL槽不足时,产生等待):

TOP等待事件分析

 

 

经分析,该等待时间容易触发ITL死锁,即导致月结经常出现死锁报错。

TOP SQL分析

分析问题时段的TOP SQL,如下:

 

ASH报告中等待事件与SQL的对应分析

从ASH报告中查看TOP SQL与等待事件的对应,可以发现enq: TX - allocate ITL entry语句主要对应的是SQLID: g3h0fxasw1j8c。

 

 

 

SQL执行计划分析

对应的SQL语句是:

死锁trace与数据库TOP SQL的对照分析

同时查看了死锁事件跟踪日志,提取了死锁的SQL,可以看出为月结涉及的Update语句,导致死锁出现,也印证了上述分析结论。

 

死锁问题的原因分析

当一个DML事务需要修改一个数据块时,需要在数据块头部获取一个可用的ITL槽,用于记录事务的id,使用undo数据块地址,scn等信息。如果事务申请不到新的可用ITL槽时,就会产生enq: TX - allocate ITL entry等待。如果ITL超过MAXTRANS指定的最大值或者没有足够的空闲ITL槽,将在块的free空间创建新的。 如果ITL槽用光并且多个并发DML事务正在操作相同的数据块,将会出现等待事件"enq: TX - allocate ITL entry"。

默认情况下创建的表ITL槽数最小为1,pctfree为10,那么如果是这样一种情况,如果表中经常执行update语句,然后块中剩余的10%空间所剩无几,而且业务的并发量还很大,此时就很容易遇到enq: TX - allocate ITL entry等待。

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。其最常见的死锁的类型分为:行级锁(row-level locks)和块级锁(block-level locks)。

此处遇到的问题即是ITL上发生的死锁,常见的处理方法就是增加数据块的PCTFREE值(允许自动扩展ITL)或者直接设置初始有更多个ITL槽。

通常通过重新创建表和索引时增加INITRANS或PCTFREE来增加ITL数量,以便能够处理更多的并发事务,同时也将有助于减少“enq: TX - allocate ITL entry”等待事件。

有如下方法来降低enq: TX - allocate ITL entry等待:

修改表/索引全部块的ITL设置:

注意:更改表/索引以设置INITRANS的新值时仅对设置后的新块生效。重建对象可以全部初始化块。

对于索引需要 rebuild or recreated。

对于table,可以通过以下方式实现:

exp/imp

alter table move

dbms_redefenition

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。