enq: TX - allocate ITL entry等待過多導致全域性死鎖
最近發現有個RAC庫後臺alert日誌中每天都會報出大量全域性死鎖,並且在AWR中發現TOP5事件中總是存在大量enq: TX - allocate ITL entry等待
如下:
SID SERIAL# STATUS USERNAME PROGRAM EVENT SECONDS_IN_WAIT BLOCKING_SESSION SQL_ID
---------- ---------- -------- ---------- -------------------- ---------------------------------------- --------------- ---------------- -------------
3085 50398 ACTIVE ECMS Aloha.exe enq: TX - allocate ITL entry 28 2826 bhwrndpu3jvpg
1589 56075 ACTIVE ECMS Aloha.exe enq: TX - allocate ITL entry 28 3088 bhwrndpu3jvpg
1833 3652 ACTIVE ECMS Aloha.exe enq: TX - row lock contention 94 3138 bhwrndpu3jvpg
2817 50181 ACTIVE ECMS Aloha.exe enq: TX - row lock contention 94 3088 bhwrndpu3jvpg
問題分析,發生allocate ITL entry等待的原因:
當一個事務需要修改一個資料塊時,需要在資料塊頭部獲取一個可用的ITL槽,用於記錄事務的id,使用undo資料塊地址,scn等資訊。如果事務申請不到新的可用ITL槽時,就會產生enq: TX - allocate ITL entry等待。 發生這個等待時,要麼是塊上的已分配ITL個數(透過ini_trans引數控制)達到了上限255(10g以後沒有了max_trans限制引數,無法指定小於255的值),要麼是這個塊中沒有更多的空閒空間來容納一個ITL了(每個ITL佔用24bytes)。 預設情況下建立的表ITL槽數最小為1+1,pctfree為10,那麼如果是這樣一種情況,如果表中經常執行update語句,然後塊中剩餘的10%空間所剩無幾,而且業務的併發量還很大,此時就很容易遇到enq: TX - allocate ITL entry等待。
如下:
SID SERIAL# STATUS USERNAME PROGRAM EVENT SECONDS_IN_WAIT BLOCKING_SESSION SQL_ID
---------- ---------- -------- ---------- -------------------- ---------------------------------------- --------------- ---------------- -------------
3085 50398 ACTIVE ECMS Aloha.exe enq: TX - allocate ITL entry 28 2826 bhwrndpu3jvpg
1589 56075 ACTIVE ECMS Aloha.exe enq: TX - allocate ITL entry 28 3088 bhwrndpu3jvpg
1833 3652 ACTIVE ECMS Aloha.exe enq: TX - row lock contention 94 3138 bhwrndpu3jvpg
2817 50181 ACTIVE ECMS Aloha.exe enq: TX - row lock contention 94 3088 bhwrndpu3jvpg
問題分析,發生allocate ITL entry等待的原因:
當一個事務需要修改一個資料塊時,需要在資料塊頭部獲取一個可用的ITL槽,用於記錄事務的id,使用undo資料塊地址,scn等資訊。如果事務申請不到新的可用ITL槽時,就會產生enq: TX - allocate ITL entry等待。 發生這個等待時,要麼是塊上的已分配ITL個數(透過ini_trans引數控制)達到了上限255(10g以後沒有了max_trans限制引數,無法指定小於255的值),要麼是這個塊中沒有更多的空閒空間來容納一個ITL了(每個ITL佔用24bytes)。 預設情況下建立的表ITL槽數最小為1+1,pctfree為10,那麼如果是這樣一種情況,如果表中經常執行update語句,然後塊中剩餘的10%空間所剩無幾,而且業務的併發量還很大,此時就很容易遇到enq: TX - allocate ITL entry等待。
問題模擬:
create table ttitl as select * from dba_objects;
select t.object_id,t.object_name,dbms_rowid.rowid_relative_fno(t.rowid),dbms_rowid.rowid_block_number(t.rowid) from ttitl t where dbms_rowid.rowid_block_number(t.rowid)=143612;
透過幾個更新語句將預設的ITL槽佔滿
update ttitl set object_name='xxxxxxxxxxx' where object_id=20;
alter system dump datafile 4 block 143612;
我們要拿4號檔案的143612塊做實驗,目前塊中擁有92行資料,現在還需要看塊上還存在多少剩餘空間? 答案是透過fseo-fsbo或者bbed得到。
fseo=0x342 --=======>>>>>>fseo代表Free Space End offset 空閒空間的結束偏儀量
0x342-0xc8=0x27A
834-200=634
產生一個事務後
fsbo=0xc8
fseo=0x32a
0x32a-0xc8=0x262=610
634-610=24bytes 也正驗證了一個itl槽佔24bytes的說法
按照這個方式計算,這個塊上還能夠存在很多事務,610/24=25,該塊上還能增加25個事務呢
現在透過update方式將塊上的空閒空間縮小
update ttitl set object_name='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' where object_id>60;
現在透過BBED和重新dump該塊發現此塊空閒空間已經只剩19bytes了
[oracle@test ~]$ cat par.txt
blocksize=8192
listfile=filelist.txt
mode=edit
[oracle@test ~]$ cat filelist.txt
1 /u01/app/oracle/oradata/orcl/system01.dbf 933232640
2 /u01/app/oracle/oradata/orcl/mctpsys.dbf 10485760
3 /u01/app/oracle/oradata/orcl/sysaux01.dbf 618659840
4 /u01/app/oracle/oradata/orcl/users01.dbf 2246574080
5 /u01/app/oracle/oradata/orcl/example01.dbf 104857600
6 /u01/app/oracle/oradata/orcl/users02.dbf 52428800
7 /u01/app/oracle/oradata/orcl/mgmt.dbf 1363148800
8 /u01/app/oracle/oradata/orcl/mgmt_deepdive.dbf 209715200
9 /u01/app/oracle/oradata/orcl/mgmt_ecm_depot1.dbf 41943040
10 /u01/app/oracle/oradata/orcl/EPMRANGE1.dbf 6442450944
11 /u01/app/oracle/oradata/orcl/EPMIDX.dbf 4294967296
12 /u01/app/oracle/oradata/orcl/EPMDAT1.dbf 209715200
13 /u01/app/oracle/oradata/orcl/undotbs02.dbf 5368709120
14 /u01/app/oracle/oradata/orcl/mctpsys1.dbf 314572800
15 /u01/app/oracle/oradata/orcl/mctpsys2.dbf 1073741824
16 /u01/app/oracle/oradata/orcl/rmantbs.dbf 209715200
17 /u01/app/oracle/oradata/orcl/ggs1.dbf 524288000
18 /u01/app/oracle/oradata/orcl/ZZZ1.DBF 20971520
[oracle@test ~]$ bbed parfile=par.txt
Password: blockedit
BBED: Release 2.0.0.0.0 - Limited Production on Mon Apr 20 11:37:30 2015
Copyright (c) 1982, 2007, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> set dba 4,143612
DBA 0x010230fc (16920828 4,143612)
BBED> map
File: /u01/app/oracle/oradata/orcl/users01.dbf (4)
Block: 143612 Dba:0x010230fc
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 120 bytes @20
struct kdbh, 14 bytes @148
struct kdbt[1], 4 bytes @162
sb2 kdbr[91] @166
ub1 freespace[19] @348 --====>>>>>>>>>>>>>塊上的空閒空間為19bytes
ub1 rowdata[7821] @367
ub4 tailchk @8188
--摘自datafile dump日誌
fsbo=0xc8
fseo=0xdb
0xdb-0xc8=0x13=19 這個塊上只有19bytes位元組的空間了,看來是無法再容納一個ITL槽了,再新產生一個事務
update ttitl set object_name='I_FILE1' where object_id=41;
此時可以看到enq: TX - allocate ITL entry等待,直至塊上的其它事務提交或回滾後,此會話才能繼續,否則一直處於等待狀態。
SQL> select sid,serial#,status,username,event,seconds_in_wait,sql_id from v$session where serial#<>1 and sql_id is not null and event not like '%SQL*Net message%' and event not like 'Streams AQ%' order by 7;
SID SERIAL# STATUS USERNAME EVENT SECONDS_IN_WAIT SQL_ID
---------- ---------- -------- ---------- ---------------------------------------- --------------- -------------
528 39292 ACTIVE TT enq: TX - allocate ITL entry 4 512zw5fc3bztt
--記錄一下enq鎖的p1 p2 p3值的含義
select * from v$session where event like 'enq%';
EVENT# 189
EVENT enq: TX - allocate ITL entry
P1TEXT name|mode
P1 1415053316
P1RAW 0000000054580004
P2TEXT usn<<16 | slot
P2 131084
P2RAW 000000000002000C
P3TEXT sequence
P3 88864
P3RAW 0000000000015B20
--P1值與鎖名稱和鎖模式有關1415053316轉換成16進位制後為54580004,其中54代表字母T,58代表字母X,合一起就是鎖的name.
SQL> select dump('T',16),dump('X',16) from dual;
DUMP('T',16) DUMP('X',16)
---------------- ----------------
Typ=96 Len=1: 54 Typ=96 Len=1: 58
--P1值的後4位0004代表申請鎖的模式
SQL> select * from v$lock where sid=528;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
00000000DEC35368 00000000DEC35388 528 TX 131084 88864 0 4 129 0
00000000DD5099A8 00000000DD5099D0 528 TM 1519283 0 3 0 1294 0
--P2和P3值與事務相關,比如上面的P2值131084代表XIDUSN和XIDSLOT,
select 131084/45536 as usn,round(mod(131084,45536)) slot from dual;
--P3值88864代表xidsqn
ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS START_TIME START_SCNB START_SCNW START_UEXT START_UBAFIL START_UBABLK START_UBASQN START_UBAREC SES_ADDR FLAG SPACE RECURSIVE NOUNDO PTX NAME PRV_XIDUSN PRV_XIDSLT PRV_XIDSQN PTX_XIDUSN PTX_XIDSLT PTX_XIDSQN DSCN-B DSCN-W USED_UBLK USED_UREC LOG_IO PHY_IO CR_GET CR_CHANGE START_DATE DSCN_BASE DSCN_WRAP START_SCN DEPENDENT_SCN XID PRV_XID PTX_XID
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ---------- ---------- ------------ ------------ ------------ ------------ ---------------- ---------- ----- --------- ------ --- -------------------------------------------------------------------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ------------- ---------------- ---------------- ----------------
00000000DD61F730 6 29 74079 19 9504 19040 51 ACTIVE 04/20/15 10:30:56 3585075880 2902 18 19 9504 19040 51 00000000DF221CA0 7683 NO NO NO NO 0 0 0 0 0 0 0 &
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26753337/viewspace-1621028/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- enq: TX - allocate ITL entry等待事件分析ENQ事件
- 關於enq: TX - allocate ITL entry等待事件ENQ事件
- [20231026]enq TX - allocate ITL entry的測試4.txtENQ
- 等待事件enq: TX - row lock contention事件ENQ
- 故障排除 | enq:TX - index contention等待事件ENQIndex事件
- 遭遇ITL死鎖
- MySQL Online DDL導致全域性鎖表案例分析MySql
- MySQL 死鎖和鎖等待MySql
- Seata 全域性鎖等待超時 問題排查
- enq: TX - row lock contentionENQ
- MySQL鎖等待與死鎖問題分析MySql
- Oracle死鎖一例(ORA-00060),鎖表導致的業務死鎖問題Oracle
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用ENQ索引
- python之GIL全域性直譯器鎖,自定義互斥鎖,死鎖與遞迴鎖Python遞迴
- sysbench花式踩坑之三:自增值導致的鎖等待
- [20181030]模擬分散式事務掛起導致TX鎖爭用.txt分散式
- 奇異的enq: TX - row lock contentionENQ
- enq: TX - index contention基礎理論ENQIndex
- 全域性鎖、表鎖、行鎖
- 全域性鎖和表鎖
- AdornerDecorator的CacheMode繫結和windows鎖屏導致TableControl鎖死問題Windows
- RAC中的enq: TS等待ENQ
- 一次死鎖導致CPU異常飄高的整個故障排查過程
- MySQL 全域性鎖和表鎖MySql
- MySQL全域性鎖、表鎖以及行鎖MySql
- Oracle Enqueues Wait Events 三 enq: TX - row lock contentionOracleENQAI
- enq: TX - index contention故障修復一例ENQIndex
- ORACLE TX鎖Oracle
- LGWR寫操作會導致效能全域性卡頓案例分析
- UINavigationController 全域性右劃導致介面假死問題解決UINavigationController
- Oracle等待事件之enq: TM – contentionOracle事件ENQ
- oracle等待事件之enq: CF – contentionOracle事件ENQ
- [20220518]enq FU - contention等待事件.txtENQ事件
- Discuz 6、7 版本存在全域性變數防禦繞過導致程式碼執行漏洞變數
- MySQL鎖問題分析-全域性讀鎖MySql
- vue-element-admin 全域性loading載入等待Vue
- Linux雜談:程式鎖核+實時執行緒導致的讀寫鎖死迴圈Linux執行緒
- MySQL死鎖案例一(回滾導致死鎖)MySql
- MySQL死鎖案例二(自增列導致死鎖)MySql