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

news/2025/2/7 4:39:07/
  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


http://www.ppmy.cn/news/80882.html

相关文章

ICR-预测三种医学状况 #$60,000 #Kaggle

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息由AI辅助创作,仅供参考 比赛名称 ICR - Identifying Age-Related Conditions[2] (见文末阅读原…

Learn From Microsoft Build Ⅰ:OpenAI

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术&#xff0…

ArcMap:第一届全国大学生GIS应用技能大赛(滁州学院)详解-上午题

目录 01 上午题 1.1 题目 1.2 数据 1.2.1 如何添加比赛数据? 1.2.2 比赛数据展示 1.3 思路 1.3.1 坐标系问题 1.4 实操 1.4.1 建立空间数据库和比赛数据导入 1.4.2 坐标系问题解决 1.4.3 要素的订正 1.4.4 数据入库和符号化管理; 1.4.5 其…

C Sharp使用HTTP代码示例

以下是使用C#发送HTTP请求的示例代码: csharp using System; using System.Net; using System.IO; class Program { static void Main(string[] args) { // 创建一个Web请求对象 HttpWebRequest request (HttpWebRequest)WebRequest.Create("Example …

java boot项目基础配置之banner与日志配置演示 并教会你如何使用文档查看配置

上文 我们简单讲了一下 springboot 项目的配置 都是写在resources下的application.properties中 springboot 项目中 配置都写在这一个文件 可以说非常方便 不像之前 写个项目配置这里一个哪里一个 看到是非常费力 我们启动项目 这里有个图案 其实 这叫 banner 我们就用配置来…

用python实现用户注册登陆系统

1 问题 如何用python实现用户注册后记录账号并能够登陆? 2 方法 引入os模块;使用db类;定义函数;If判断语句; 代码清单 1 import osdef login(username,password): f open("db",r) for line in f: …

苏州狮山广场能耗管理系统

摘要:随着社会生活水平的提高,经济的繁荣发展,人们对能源的需求逐渐增长,由此带来的能源危机日益严重。商场如何实时的了解、分析和控制商场的能源消耗已成为需要解决的迫在眉睫的难题。传统的能源消耗智能以月/季度/年为周期进行…

【JavaSE】Java基础语法(九):封装

文章目录 ☔1. private关键字☔2. private关键字的使用☔3. this关键字☔4. this内存原理☔5. 封装思想 ☔1. private关键字 概述 : private是一个修饰符,可以用来修饰成员(成员变量,成员方法) 特点 : 被private修饰的成员&…