暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

enq: TX - allocate ITL entry等待事件

347

Part1问题报错

业务方面反馈操作异常缓慢,观看awr报告发现有大量的update语句堵塞卡住了,等待事件包括 enq: TX - allocate ITL entry。也从 segments BY ITL WAITS发现了具体的数据库对象。

Part2问题解决

2.1Mos解决方案

1、等待事件 enq: TX - allocate ITL entry 出现并占比很高

2、通过报告 ITL Waits定位数据库对象 ZJ2025

3、查询数据库的对象信息 (pctfree 10 initrans 1) 、表和索引信息(segments)

4、尝试操作(修改表属性、move移动表、重建索引)

5、检查对象是否正常(表是否修改成功、索引是否可用)

2.2实操步骤

#数据库信息
用户
密码:
连接串:

#查询数据库对象
select owner,segment_name,segment_type,round(bytes/1024/1024/1024,2) from dba_segments where segment_name='ZJ_2025';
OWNER SEGMENT_NAME SEGMENT_TYPE       ROUND(BYTES/1024/1024/1024,2)
------------------ ------------------ -----------------------------
TR_9999   ZJ_2025 TABLE           2.53

#查询数据库建表语句
SELECT u.table_name,  DBMS_METADATA.GET_DDL('TABLE',  u.table_name) table_ddl FROM user_tables u WHERE table_name in ('ZJ_2025');
##就是截取了这一部分
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255


#修改对象
alter table TR_9999.ZJ_2025 pctfree 20 initrans 50;

#重新移动表生效
alter table TR_9999.ZJ_2025 move tablespace TR_DATA9 online;

##重建失效索引
select 'ALTER INDEX ' || owner ||'.'|| index_name || '  REBUILD  tablespace TR_DATA9 parallel 12 online;'from dba_indexes where   owner='TR_9999' and status = 'UNUSABLE';

##查询是否还有失效索引
select owner,index_name,table_name,status from  dba_indexes where owner='TR_9999' and status =  'UNUSABLE';

#初选表属性是否修改
SELECT u.table_name,  DBMS_METADATA.GET_DDL('TABLE',  u.table_name) table_ddl FROM user_tables u WHERE table_name in ('ZJ_2025');

 PCTFREE 20 PCTUSED 40 INITRANS 50 MAXTRANS 255
数据块的可用空间,这个是是百分比
PCTFREE 20
 
事务槽是 50,最大可以255,这个是条数
INITRANS 50 MAXTRANS 255

Part3问题原理

3.1等待事件解析

队列锁:事务锁 - 分配事务槽等待(enq: TX - allocate ITL entry)

3.2专有名词解析

ITL(事务槽)

Interested Transaction List (ITL) 是 Oracle 数据块中的一个关键数据结构,用于管理并发事务对块内数据的访问。每个数据块都包含一个 ITL 条目列表,记录哪些事务正在访问该块中的行。

3.3构成问题原因

数据块内并发事务的需求超过了该数据块所能提供的ITL槽数量。 表/索引的初始设置不合理(最常见): INITRANS 设置过低:在创建表或索引时,INITRANS 参数定义了数据块初始分配的ITL槽数量。默认是1(对于表)或2(对于索引)。如果初始值设得太小,在高并发环境下很容易就不够用。

高并发DML操作: 多个会话同时对同一个数据块中的不同行进行修改。这在频繁更新的表上很容易发生,特别是当这些行的数据聚集在少数几个数据块中时(例如,通过序列填充的主键,但数据插入无序,导致数据分散)。

长时间未提交的事务: 如果一个事务占着一个ITL槽但长时间既不提交也不回滚,那么这个ITL槽就会被一直占用,无法释放给其他事务使用。这会加剧ITL槽的短缺。

索引块分裂: 索引块的分裂过程本身也需要ITL槽。在高并发插入导致索引频繁分裂时,也可能引发索引块上的ITL争用。

3.4问题解决

增加目标数据块可用的ITL槽数量(DBA操作)或减少对同一数据块的并发访问(业务优化逻辑)。

3.5优缺点

如果把表的空闲可用空间(PCTFREE)修改的大一点, 缺点:那同样的数据量需要更多的块来存放,全表扫描会耗费更多的资源,类似于高水位线的感觉。 优点:可以把对数据库表修改块的并行提高上去。提高效率。

Part4事后对比

修改以后,通过两天同一个时间段的awr报告对比,发现 ZJ_2025的占比已经消失,优化成功。

Part5文档借鉴

1472175.1.pdf

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论