Enqueue 整理总结Word格式.docx
《Enqueue 整理总结Word格式.docx》由会员分享,可在线阅读,更多相关《Enqueue 整理总结Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
select*fromv$resource;
ADDRTYID1ID2
------------------------------
6D304434XR40
6D304594CF00
6D3046F4RT10
6D30474CRS251
6D304904MR30
6D30495CMR40
6D3049B4MR50
6D304B24MR10
6D304B7CMR20
6D304BD4MR2010
6D305634TA61
6D305B5CPW10
6D3069DCTS31
已选择13行。
根据以上查询输出,我们可以看到enqueueresourcestructure由locktype和两个参数组成.Oracle用两个字符符号例如(TX,TM,TS,MR,RT,etc)表示locktype.ID1,ID2两个参数由于locktype的不同所以具有不同含义.
具体可以参见<
<
Wait.Interface.A.Practical.Guide.to.Performance.Diagnostics.and.Tuning>
>
第六章Enqueue部分Table6-3.
在Oracle10g之前,ID1和ID2对于不同类型lock的含义并未公开.
在Oracle10g中可以通过如下查询轻松得到.
colnamefora20
colparameter2fora20
colparameter3fora20
selectname,parameter2,parameter3fromv$event_name
/
稍后在本文enqueue资源争用部分再对ID1与ID2作详细介绍.
可以被lockmanager并行锁的enqueueresources的最大数量由ENQUEUE_RESOURCES初始化参数控制.该参数默认值通常来讲已经足够,如果在应用程序中使用并行DML操作,可以考虑增加ENQUEUE_RESOURCES的值.
关于ENQUEUE_RESOURCES[10..65535]
Atdatabasestartuptime,OracleallocatesthenumberofenqueuesspecifiedbytheENQUEUE_RESOURCESparameter.ThedefaultvalueofENQUEUE_RESOURCESisderivedfromtheSESSIONSparameterandisusuallyadequate,aslongasitsvalueisgreaterthanDML_LOCKS+20.Forthreeorfewersessions,thedefaultvalueisthenumberofdatabasefiles+20.For4to10sessions,thedefaultvalueisthenumberofdatabasefiles+((SESSIONS-3)*5)+20.Formorethan10sessions,itisthenumberofdatabasefiles+((SESSIONS-10)*2)+55.
IfyouexplicitlysetENQUEUE_RESOURCEStoavaluehigherthanDML_LOCKS+20,thenOracleusesthevalueyouprovide.OraclewillautomaticallyallocateadditionalenqueuesfromthesharedpoolasneededifthenumberspecifiedbyENQUEUE_RESOURCESisexceeded.YoucancheckresourceusagebyqueryingV$RESOURCE_LIMIT.
不能获取anenqueueresource的进程会报ORA-00052:
"
maximumnumberofenqueueresourcesexceeded"
error.
V$RESOURCE_LIMIT视图提供系统资源使用的信息.通过这个视图可以监控很多数据库资源(resources,locks,orprocesses)的消耗情况.
注意一下这个视图的几个字段:
MAX_UTILIZATION表示实例启动后该类资源的最大消耗值
以下监控与enqueue有关的资源消耗情况:
colnamefora18
collimit_usagefora15
selectRESOURCE_NAMEname,
CURRENT_UTILIZATIONcur_usage,
MAX_UTILIZATIONmax_usage,
LIMIT_VALUElimit_usage,
INITIAL_ALLOCATIONinit_allo
fromv$resource_limit
whereresource_namein('
enqueue_resources'
'
enqueue_locks'
'
dml_locks'
processes'
sessions'
)
NAMECUR_USAGEMAX_USAGELIMIT_USAGEINIT_ALLO
----------------------------------------------------------------
processes19249090
sessions2330104104
enqueue_locks132414801480
enqueue_resources1313UNLIMITED676
dml_locks07UNLIMITED456
WhatIsanEnqueueLock?
Anenqueuelock是lock本身.Oracle用一个单独的数组管理.可以通过X$KSQEQ(kernelserviceenqueueobject)或者V$ENQUEUE_LOCK试图察看.隐含参数_ENQUEUE_LOCKS影响这个数组的大小.
Oracle使用不同的结构管理TXandTM队列.
X$KTCXB(kerneltransactioncontroltransactionobject—thebaseviewforV$TRANSACTION_ENQUEUE)andX$KTADM(kerneltransactionaccessdefinitiondmllock).TRANSACTIONSandDML_LOCKS初始化参数会决定管理TXandTM队列的结构大小.
当然通过查询V$LOCK可以获得所有数据库locks的信息.也是我们诊断enqueue争用的一个重要视图.
EnqueueArchitecture
在数据库内部,enqueuearchitecture和sga中cachebuffersarchitecture十分近似.(读过eygle<
Oracle入门,进阶与诊断案例>
这本书的朋友可以参照学习enqueuearchitecture)
enqueuearchitecture的最主要组件由enqueuehashchainslatches,enqueuehashtable,enqueuehashchains,andenqueueresources组成.
它们之间的数量关系:
enqueuehashchainslatch(1:
m)ahashbucket(1:
1)aenqueuehashchain.
子enqueuehashchainslatches保护enqueuehashtableandhashchains.默认状态下enqueuehashchainslatches的个数等于CPU_COUNT,这个数量可以通过隐含参数_ENQUEUE_HASH_CHAIN_LATCHES调整.
根据resourcetypeandidentifiersv$resource(TY,ID1,ID2)Enqueueresources被hash到enqueuehashtable并且被置于相应enqueuehashchains.要使用某个enqueueresource必须获取相应enqueuehashchain.enqueuehashtable的大小来源于SESSIONS初始化参数,也可以通过设置_ENQUEUE_HASH设置.
IfyoueverneedtoincreasetheENQUEUE_RESOURCESparametersignificantlyfromitsdefaultvalue,youmightwanttokeepaneyeonthesleeprateoftheenqueuehashchainslatches.ThisisbecausetheenqueuehashtablelengthwillremainthesamebecauseitisderivedfromSESSIONS,notfromENQUEUE_RESOURCES.Thecombinationofahighdemandforenqueueresourcesandasmallenqueuehashtablewillresultinahigherhashcollisionrateandpotentiallylengthyhashchains.Thisproblemmanifestsitselfaslatchcontentionsfortheenqueuehashchainslatches.Inthiscase,youneedtoincreasethe_ENQUEUE_HASH.
enqueuehashtablelength=((SESSIONS–10)*2)+55
通过dumpenqueue结构进一步学习:
altersessionsetevents’immediatetracenameenqueueslevel3’;
DecodingEnqueueTypeandMode
Oracle通过对P1列的解码,我们可以得知enqueuetype和mode.
selectsid,event,p1,p1raw,
chr(bitand(P1,-16777216)/16777215)||chr(bitand(P1,16711680)/65535)type,
mod(P1,16)"
MODE"
fromv$session_wait
whereevent='
enqueue'
另一种方法.通过v$session_wait(p1raw)列也可以.
Thevaluesfromtheaboveexamplearefroma64-bitOracleDatabase.Youcanignoretheleadingzerosandfocusonthelast4bytes(thatis,thelasteightnumbers).Thehighorder2bytesgivetheenqueuetype.Using54580006asanexample,the2highorderbytesare0x5458Hex.Now,54Hexisdecimal84and58Hexisdecimal88,sotheenqueuetypecanbediscoveredasfollows:
(AppendixBhasacompletelistofenqueuetypes.)
selectchr(84)||chr(88)fromdual;
CH--TX
Oracle10g后enqueuewaiteventname可以通过v$session_wait(event)直接获得.
Processesrequestenqueuelocksinoneofthesesixmodes:
Null(N),RowShare(RS),RowExclusive(RX),Share(S),ShareRowExclusive(SRX),orExclusive(X)
这部分可参见Oracle相关文档.
CommonCauses,Diagnosis,andActions
由于enqueuetype种类繁多,产生anenqueuewaitevent的原因也不同.我们可以根据多个session正在竞争的enqueue的type和mode找到不同的解决方法.
对于每一种type的enqueue,Oracle内部通过X$KSQST维护一条相应的记录.在Oracle9i中,通过V$ENQUEUE_STAT视图,可以具体获得不同typeenqueue的请求统计信息(实例启动后的统计值).
--Oracle7.1.6to8.1.7
selectinst_id,
ksqsttypinst_lock,
ksqstgetinst_Gets,
ksqstwatinst_Waits
fromx$ksqst
whereksqstwat>
0
orderbyinst_id,ksqstwat
--Oracle9iDatabaseandabove
select*
fromv$enqueue_stat
wherecum_wait_time>
orderbyinst_id,cum_wait_time
下面就最常见的一些enqueue等待事件进行讨论.
WaitforTXEnqueueinMode6
对于TXenqueueinmode6的等待是最常见的enqueuewait
(InOracleDatabase10g,thewaiteventnameisenq:
TX—rowlockcontention.).当一个事物试图update或delete一行或多行已经被另一个事物锁定的记录时这个等待事件发生.通常这是由应用程序引起的.
eg.
在SessionA中:
updateasetobject_id=0whereobject_id=11;
与此同时在SessionB中执行相同的语句,SessionBishung:
SessionB一直会等待sessionA提交或回滚此事物.
没有其他方法可以释放SessionA持有的rowexclusivelock(KillsessionA会引起事物被pmon回滚并释放相应lock资源)
ThefollowinglistingshowsanexampleofTXenqueuewaitinmode6asseenintheV$LOCKview:
ADDRKADDRSIDTYID1ID2LMODEREQUESTCTIMEBLOCK-------------------------------------------------------A3950688A395069C10TM18815403030
A304E2A0A304E2B010TX655851478360630
01AD23D401AD24A420TX6558514783660101A3950A28A3950A3C20TM188154030100
每当你发现TXenqueue等待事件时,首要任务是找出哪个session是锁阻塞者(sessionA),哪些session是锁等待者(sessionB),在一个繁忙的系统中,很科能伴有多个锁等待者.
使用以下sql定位即可:
/*
BLOCKER_SID:
锁持有者sid(阻塞sid)
WAITER_SID:
等待者sid
MODE_HELD:
锁持有模式
REQUEST_MODE:
请求模式
*/
select/*+ordered*/a.sid
blocker_sid,
a.username
blocker_username,
a.serial#,
a.logon_time,
b.type,
b.lmodemode_held,
b.ctimetime_held,
c.sidwaiter_sid,
c.requestrequest_mode,
c.ctimetime_waited
fromv$lockb,
v$enqueue_lockc,
v$sessiona
wherea.sid=b.sid
andb.id1=c.id1(+)
andb.id2=c.id2(+)
andc.type(+)='
TX'
andb.type='
andb.block=1
orderbytime_held,time_waited
你也可通过以下查询定位,哪些数据库资源正在被征用.
selectc.sidwaiter_sid,
a.object_name,
a.object_type
fromdba_objectsa,
v$sessionb,
v$session_waitc
where(a.object_id=b.row_wait_obj#ora.data_object_id=b.row_wait_obj#)
andb.sid=c.sid
andchr(bitand(c.P1,-16777216)/16777215)||chr(bitand(c.P1,16711680)/65535)='
andc.eventlike'
enq%'
当发生TXEnqueueinMode6等待事件时
获取到waitingsession和blockingsession正在执行的sql语句十分重要.我们可以通过这个sql语句定位应用程序可能出现问题(1很有可能应用程序没有commit2没有及时commit或rollbackDML操作这就需要结合应用需求而调整了)的大致范围.
WaitforTXEnqueueinMode4—ITLShortage
TXenqueueinmode4的等待事件我们分成3部分讨论.
1>
ITL(interestedtransactionlist)shortage
2>
Uniquekeyenforcement
3>
Bitmapindexentry
Ok我们先从ITLShortage说起.
selectdbms_rowid.ROWID_RELATIVE_FNO(rowid)file_no,
2dbms_rowid.ROWID_BLOCK_NUMB