天萃荷净

运维DBA反映Oracle数据库出现enq:TX–allocate ITL entry等待事件,结合案例分析该等待事件产生原因和解决办法

今天在分析一份awr中发现了较为明显的enq: TX – allocate ITL entry等待,这里通过试验详细重现了enq: TX – allocate ITL entry等待

1.创建测试对象

SQL> create table t_oracleplus (name char(2000)) pctfree 0 initrans 1;

Table created.

SQL> insert into t_oracleplus select object_name from all_objects where rownum < 5;

4 rows created.

SQL> commit;

Commit complete.

SQL> alter system flush buffer_cache;

System altered.

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid) file#,

2 dbms_rowid.rowid_block_number(rowid) block# from t_oracleplus;

FILE# BLOCK#

---------- ----------

4 32

2.bbed查看block

BBED> set block 32

BLOCK# 32

BBED> map

File: /u01/oracle/oradata/XFF/users01.dbf (0)

Block: 32 Dba:0x00000000

------------------------------------------------------------

KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes @0

struct ktbbh, 72 bytes @20

struct kdbh, 14 bytes @100

struct kdbt[1], 4 bytes @114

sb2 kdbr[4] @118

ub1 freespace[38] @126 --该block空闲空间为38byte

ub1 rowdata[8024] @164

ub4 tailchk @8188

BBED> p ktbbh

struct ktbbh, 72 bytes @20

ub1 ktbbhtyp @20 0x01 (KDDBTDATA)

union ktbbhsid, 4 bytes @24

ub4 ktbbhsg1 @24 0x0000d318

ub4 ktbbhod1 @24 0x0000d318

struct ktbbhcsc, 8 bytes @28

ub4 kscnbas @28 0xc0320e3b

ub2 kscnwrp @32 0x0b2c

b2 ktbbhict @36 2

ub1 ktbbhflg @38 0x32 (NONE)

ub1 ktbbhfsl @39 0x00

ub4 ktbbhfnx @40 0x01000019

struct ktbbhitl[0], 24 bytes @44 --1个itl slot为24byte

struct ktbitxid, 8 bytes @44

ub2 kxidusn @44 0x0015

ub2 kxidslt @46 0x0019

ub4 kxidsqn @48 0x00000005

struct ktbituba, 8 bytes @52

ub4 kubadba @52 0x0080009d

ub2 kubaseq @56 0x0002

ub1 kubarec @58 0x28

ub2 ktbitflg @60 0x2004 (KTBFUPB)

union _ktbitun, 2 bytes @62

b2 _ktbitfsc @62 0

ub2 _ktbitwrp @62 0x0000

ub4 ktbitbas @64 0xc0320e4e

struct ktbbhitl[1], 24 bytes @68 --有两个itl slot

struct ktbitxid, 8 bytes @68

ub2 kxidusn @68 0x0000

ub2 kxidslt @70 0x0000

ub4 kxidsqn @72 0x00000000

struct ktbituba, 8 bytes @76

ub4 kubadba @76 0x00000000

ub2 kubaseq @80 0x0000

ub1 kubarec @82 0x00

ub2 ktbitflg @84 0x0000 (NONE)

union _ktbitun, 2 bytes @86

b2 _ktbitfsc @86 0

ub2 _ktbitwrp @86 0x0000

ub4 ktbitbas @88 0x00000000

通过bbed我们可以得出如下结论:

1.该block剩余38 byte 空闲空间可以用来存放数据

2.该block 初始化 itl 为2(和我们设置的1不相符)

3.一个itl slot为24byte

更新表记录

--session 1

SQL> select trim(name) from t_oracleplus;

TRIM(NAME)

--------------------------------------------------------------------------------

ICOL$

I_USER1

CON$

UNDO$

SQL> update t_oracleplus set name='WWW.oracleplus.COM' WHERE name='ICOL$';

1 row updated.

--session 2

SQL> update t_oracleplus set name='www.orasos.com' where name='UNDO$';

1 row updated.

--session 3

SQL> update t_oracleplus set name='www.oracleplus.com' where name='CON$';

1 row updated.

--session 4

SQL> update t_oracleplus set name='www.oracleplus.com' where name='I_USER1';

--hang住

--session 5

SQL> select event from v$session where event like 'enq%';

EVENT

----------------------------------------------------------------

enq: TX - allocate ITL entry

通过这里可以看到我们模拟了4个update 该block操作(均未提交),前面三个可以正常的update操作,第四个出现了enq: TX – allocate ITL entry等待,根据我们知识分析(未提交事务的itl不能覆盖,一个dml操作需要一个itl),这里使用了3个itl slot,而我们已经知道一个itl 需要24byte,该block初始化有2个itl,现在这里有3个dml操作成功,即占用了3个itl,所以该block的剩余空间只有38-24=14 byte<24byte,因此无法分配第四个itl slot从而出现了enq: TX - allocate ITL entry等待

bbed验证上述分析

BBED> map

File: /u01/oracle/oradata/XFF/users01.dbf (0)

Block: 32 Dba:0x00000000

------------------------------------------------------------

KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes @0

struct ktbbh, 96 bytes @20

struct kdbh, 14 bytes @124

struct kdbt[1], 4 bytes @138

sb2 kdbr[4] @142

ub1 freespace[14] @150

ub1 rowdata[8024] @164

ub4 tailchk @8188

BBED> p ktbbh

struct ktbbh, 96 bytes @20

ub1 ktbbhtyp @20 0x01 (KDDBTDATA)

union ktbbhsid, 4 bytes @24

ub4 ktbbhsg1 @24 0x0000d318

ub4 ktbbhod1 @24 0x0000d318

struct ktbbhcsc, 8 bytes @28

ub4 kscnbas @28 0xc0320eb0

ub2 kscnwrp @32 0x0b2c

b2 ktbbhict @36 3

ub1 ktbbhflg @38 0x32 (NONE)

ub1 ktbbhfsl @39 0x00

ub4 ktbbhfnx @40 0x01000019

struct ktbbhitl[0], 24 bytes @44

struct ktbitxid, 8 bytes @44

ub2 kxidusn @44 0x0003

ub2 kxidslt @46 0x001f

ub4 kxidsqn @48 0x00000208

struct ktbituba, 8 bytes @52

ub4 kubadba @52 0x00800027

ub2 kubaseq @56 0x0414

ub1 kubarec @58 0x01

ub2 ktbitflg @60 0x0001 (NONE)

union _ktbitun, 2 bytes @62

b2 _ktbitfsc @62 0

ub2 _ktbitwrp @62 0x0000

ub4 ktbitbas @64 0x00000000

struct ktbbhitl[1], 24 bytes @68

struct ktbitxid, 8 bytes @68

ub2 kxidusn @68 0x000a

ub2 kxidslt @70 0x000f

ub4 kxidsqn @72 0x00000185

struct ktbituba, 8 bytes @76

ub4 kubadba @76 0x0080008a

ub2 kubaseq @80 0x01a6

ub1 kubarec @82 0x0c

ub2 ktbitflg @84 0x0001 (NONE)

union _ktbitun, 2 bytes @86

b2 _ktbitfsc @86 0

ub2 _ktbitwrp @86 0x0000

ub4 ktbitbas @88 0x00000000

struct ktbbhitl[2], 24 bytes @92

struct ktbitxid, 8 bytes @92

ub2 kxidusn @92 0x0008

ub2 kxidslt @94 0x002a

ub4 kxidsqn @96 0x00000217

struct ktbituba, 8 bytes @100

ub4 kubadba @100 0x008000cc

ub2 kubaseq @104 0x0291

ub1 kubarec @106 0x12

ub2 ktbitflg @108 0x0001 (NONE)

union _ktbitun, 2 bytes @110

b2 _ktbitfsc @110 0

ub2 _ktbitwrp @110 0x0000

ub4 ktbitbas @112 0x00000000

可以看到剩余空间为14byte,事务槽为3个,因此上述分析为正确。

提交会话测试

--session 1

SQL> commit;

Commit complete.

--session 4

SQL> update t_oracleplus set name='www.oracleplus.com' where name='I_USER1';

1 row updated.

证明commit掉事务后,itl slot可以重利用

4.总结说明

enq: TX – allocate ITL entry为分配ITL条目的等待,因为PCTFREE不足,BLOCK中没有足够空间分配ITL,ORACLE只能重用ITL,但是这个时候由于没有COMMIT,无法重用ITL,所以会出现allocate ITL等待事件。要解决此类问题,我们可以考虑增加PCTFREE和initrans大小,需要注意该修改只能对于新block生效,已经存放数据的block不会发生改变.另外可以考虑修改业务逻辑,减少频繁访问

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle等待事件 enq:TX–allocate ITL entry产生原因和解决办法

oracle job enq tx,【学习笔记】Oracle等待事件 enq:TX–allocate ITL entry产生原因和解决办法...相关推荐

  1. MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法

    MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 参考文章: (1)MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 (2)https://www.cnblogs.com/tiny ...

  2. oracle数据库开多线程,学习笔记:Oracle表数据导入 DBA常用单线程插入 多线程插入 sql loader三种表数据导入案例...

    天萃荷净 oracle之数据导入,汇总开发DBA在向表中导入大量数据的案例,如:单线程向数据库中插入数据,多线程向数据表中插入数据,使用sql loader数据表中导入数据案例 1.Oracle数据库 ...

  3. oracle 删除awr报告,学习笔记:Oracle awr入门 深入了解AWR报告

    天萃荷净 深入了解AWR报告,ASH与AWR报告的官方说明,数据库进程和性能视图获取 1.AWR与ASH概念 1.ASH 若是一个普通的会话(我是指没有大量地耗费资源),则对于性能调整来说无足轻重.但 ...

  4. oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...

    天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...

  5. oracle 创建角色 权限设置,[学习笔记] Oracle创建用户、分配权限、设置角色,

    [学习笔记] Oracle创建用户.分配权限.设置角色, 创建用户 create user student --用户名 identified by "123456" --密码 de ...

  6. oracle的脚本日志,学习笔记:Oracle alert日志文件巡检脚本

    天萃荷净 分享一篇Oracle alert日志文件巡检脚本 每天都检查oracle日志,所以写了一个比较完善的shell,让其自动处理,在运行程序之前,需要在该脚本目录下新建tmp目录 #!/usr/ ...

  7. oracle rac 环境配置文件,学习笔记:Oracle RAC spfile参数文件配置案例详解

    天萃荷净 rac中的spfile探讨,记录一下Oracle RAC搭建完成后关于spfile参数文件的配置案例,与更改RAC环境中参数文件的方法 今天朋友的的rac,因为被同事做数据库升级,分别在两个 ...

  8. oracle常用数据统计,学习笔记:Oracle DBMS_STATS常用方法汇总 常用于收集统计oracle...

    天萃荷净 Oracle数据库中DBMS_STATS常用方法(收集oracle数据库.索引.表等信息) –收集Oracle数据库信息命令 EXEC DBMS_STATS.gather_database_ ...

  9. oracle数据变化记录,学习笔记:Oracle伪列函数ora_rowscn 记录表中行数据的修改时间...

    天萃荷净 Oracle数据库开发时使用伪列函数ora_rowscn查询出数据库表中行数据的修改时间 一.默认情况下 –创建t_orascn测试表 SQL> create table t_oras ...

最新文章

  1. springboot 事务手动回滚_来,讲讲Spring事务有哪些坑?
  2. linux ie 插件目录在哪个文件夹里,Linux下的IE浏览器使用方法[图]
  3. 10 行 Python 代码,批量压缩图片 500 张,简直太强大了
  4. 在linux的weblogic上增加启动参数
  5. Java DO到DTO转换利用spring 的BeanUtils.copyProperties
  6. js 数组遍历for..in弊端
  7. matlab零相移滤波,零相移数字滤波器边界效应讨论(附程序与参考文献)
  8. oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)
  9. Nacos版本升级1.1.3 >> 1.3.1 —>再升级至1.3.2
  10. linux tcl是什么系统,基于Linux 及Tcl / Tk 的数控系统人机界面的实现
  11. linux 默认文件属性,linux - 文件夹、文件默认属性: umask使用
  12. amaze ui使用简介
  13. 计算机专业技术面试题
  14. python 大智慧股池_大智慧股票池
  15. 欧洲之星fotona4d有效果吗?做一次有效果吗?
  16. 初中OJ1998【2015.8.3普及组模拟赛】饥饿的WZK(hunger)
  17. 5个高质量简历模板网站,免费、免费、免费
  18. DC-DC变换器(DCDC Converter / Switched-mode Power Supply)简介
  19. 一步一步玩转树莓派~
  20. 布施持戒忍辱精进禅定般若——净空法师【转】

热门文章

  1. Wework创始人再创业,靠美版“自如”估值10亿美金
  2. Flink系列-背压(反压)
  3. ADI电路设计电子书课件分享
  4. Meta宣布大裁员,超11000人!毕业前夜员工瑟瑟发抖,坐等明早的大礼包开奖!...
  5. 〖Python接口自动化测试实战篇③〗- 什么才是真正的自动化 - 自动化测试的意义又是什么?
  6. Integrity check failed for “antd“ (computed integrity doesn‘t match our records
  7. DaoCloud道客云原生开源项目KLTS,全称为Kubernetes Long Term Support,为Kubernetes早期版本提供长期免费的维护支持
  8. ZOJ 3898 - Stean 积分
  9. 西门子医疗肿瘤诊疗、远程医疗、公卫建设等领域尖端科技将亮相 | 进博会倒计时...
  10. 快速Vsftpd配置手记