Part1問題報(bào)錯(cuò)
業(yè)務(wù)方面反饋操作異常緩慢,觀看awr報(bào)告發(fā)現(xiàn)有大量的update語句堵塞卡住了,等待事件包括 enq: TX - allocate ITL entry。也從 segments BY ITL WAITS發(fā)現(xiàn)了具體的數(shù)據(jù)庫對(duì)象。
Part2問題解決
2.1Mos解決方案
1、等待事件 enq: TX - allocate ITL entry 出現(xiàn)并占比很高
2、通過報(bào)告 ITL Waits定位數(shù)據(jù)庫對(duì)象 ZJ2025
3、查詢數(shù)據(jù)庫的對(duì)象信息 (pctfree 10 initrans 1) 、表和索引信息(segments)
4、嘗試操作(修改表屬性、move移動(dòng)表、重建索引)
5、檢查對(duì)象是否正常(表是否修改成功、索引是否可用)
2.2實(shí)操步驟
#數(shù)據(jù)庫信息
用戶
密碼:
連接串:
#查詢數(shù)據(jù)庫對(duì)象
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
#查詢數(shù)據(jù)庫建表語句
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
#修改對(duì)象
alter table TR_9999.ZJ_2025 pctfree 20 initrans 50;
#重新移動(dòng)表生效
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
數(shù)據(jù)塊的可用空間,這個(gè)是是百分比
PCTFREE 20
事務(wù)槽是 50,最大可以255,這個(gè)是條數(shù)
INITRANS 50 MAXTRANS 255
Part3問題原理
3.1等待事件解析
隊(duì)列鎖:事務(wù)鎖 - 分配事務(wù)槽等待(enq: TX - allocate ITL entry)
3.2專有名詞解析
ITL(事務(wù)槽)
Interested Transaction List (ITL) 是 Oracle 數(shù)據(jù)塊中的一個(gè)關(guān)鍵數(shù)據(jù)結(jié)構(gòu),用于管理并發(fā)事務(wù)對(duì)塊內(nèi)數(shù)據(jù)的訪問。每個(gè)數(shù)據(jù)塊都包含一個(gè) ITL 條目列表,記錄哪些事務(wù)正在訪問該塊中的行。
3.3構(gòu)成問題原因
數(shù)據(jù)塊內(nèi)并發(fā)事務(wù)的需求超過了該數(shù)據(jù)塊所能提供的ITL槽數(shù)量。 表/索引的初始設(shè)置不合理(最常見): INITRANS 設(shè)置過低:在創(chuàng)建表或索引時(shí),INITRANS 參數(shù)定義了數(shù)據(jù)塊初始分配的ITL槽數(shù)量。默認(rèn)是1(對(duì)于表)或2(對(duì)于索引)。如果初始值設(shè)得太小,在高并發(fā)環(huán)境下很容易就不夠用。
高并發(fā)DML操作: 多個(gè)會(huì)話同時(shí)對(duì)同一個(gè)數(shù)據(jù)塊中的不同行進(jìn)行修改。這在頻繁更新的表上很容易發(fā)生,特別是當(dāng)這些行的數(shù)據(jù)聚集在少數(shù)幾個(gè)數(shù)據(jù)塊中時(shí)(例如,通過序列填充的主鍵,但數(shù)據(jù)插入無序,導(dǎo)致數(shù)據(jù)分散)。
長(zhǎng)時(shí)間未提交的事務(wù): 如果一個(gè)事務(wù)占著一個(gè)ITL槽但長(zhǎng)時(shí)間既不提交也不回滾,那么這個(gè)ITL槽就會(huì)被一直占用,無法釋放給其他事務(wù)使用。這會(huì)加劇ITL槽的短缺。
索引塊分裂: 索引塊的分裂過程本身也需要ITL槽。在高并發(fā)插入導(dǎo)致索引頻繁分裂時(shí),也可能引發(fā)索引塊上的ITL爭(zhēng)用。
3.4問題解決
增加目標(biāo)數(shù)據(jù)塊可用的ITL槽數(shù)量(DBA操作)或減少對(duì)同一數(shù)據(jù)塊的并發(fā)訪問(業(yè)務(wù)優(yōu)化邏輯)。
3.5優(yōu)缺點(diǎn)
如果把表的空閑可用空間(PCTFREE)修改的大一點(diǎn), 缺點(diǎn):那同樣的數(shù)據(jù)量需要更多的塊來存放,全表掃描會(huì)耗費(fèi)更多的資源,類似于高水位線的感覺。 優(yōu)點(diǎn):可以把對(duì)數(shù)據(jù)庫表修改塊的并行提高上去。提高效率。
Part4事后對(duì)比
修改以后,通過兩天同一個(gè)時(shí)間段的awr報(bào)告對(duì)比,發(fā)現(xiàn) ZJ_2025的占比已經(jīng)消失,優(yōu)化成功。
Part5文檔借鑒
1472175.1.pdf




