Enqueue 整理总结.docx
- 文档编号:8697850
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:23.07KB
Enqueue 整理总结.docx
《Enqueue 整理总结.docx》由会员分享,可在线阅读,更多相关《Enqueue 整理总结.docx(10页珍藏版)》请在冰豆网上搜索。
Enqueue整理总结
建议大家看看原文文档区可以下到..《Wait.Interface.A.Practical.Guide.to.Performance.Diagnostics.and.Tuning》这本书写的不错.
当处理enqueue等待时,熟记这些要点:
1Enqueues是应用到数据库对象的locks.与latch(应用于SGA内存)不同.
2Enqueues是由应用程序发起,具有事务性.(具体参见下文)
3Oraclesession正在等候获取一个特定的enqueue.enqueue的名字和mode被记录在P1参数里.
针对不同类型的enqueue竞争应采用不同的方式解决.
4一直到Oracle9i,enqueuewaitevent代表所有enqueuewaits;从Oracle10g开始enqueuewaits被分类定义(下文详细介绍).
WhatIsanEnqueue?
一个enqueue是什么由具体环境决定.如果它被看成是动词,则表示将一个lock请求置于一个队列的动作.如果被看成是名词,它表示一个特定的lock,比如TX事务enqueue.
Enqueues是一种非常精密的锁定机制,用来管理访问数据库共享资源,比如(objects,backgroundjobs,andredothreads).Oracle使用enqueues出于两个目的:
第一,当enqueue为不兼容模式(mode)时,enqueues防止并发sessions共享数据库资源.第二,当enqueue为兼容模式时,enqueues容许并发sessions共享数据库资源.
当sessionA请求一个数据库对象上的锁资源时,
如果被请求的锁模式为不兼容模式,且该数据库对象已经被另一个session以不兼容模式锁持有,则sessionA将它的锁请求放置于一个队列里并且按顺序等待被唤起.这个事件被称为enqueuewait.
Enqueuewaits除了包括bufferlocks(discussedinthe“BufferBusyWaits”section),librarycachelocks,rowcachelocks,andPCM(ParallelCacheManagement)locks,也是对各种locallocks的等待.
WhatIsanEnqueueResource?
Anenqueueresource是由于受到一个enqueuelock的数据库资源.
Oracle通过内部数组结构进行管理.
通过X$KSQRS(kernelserviceenqueueresource)orV$RESOURCE视图可以看到具体条目.
SQL>select*fromv$resource;
ADDRTYID1ID2
------------------------------
6D304434XR40
6D304594CF00
6D3046F4RT10
6D30474CRS251
6D304904MR30
6D30495CMR40
6D3049B4MR50
6D304B24MR10
6D304B7CMR20
6D304BD4MR2010
6D305634TA61
ADDRTYID1ID2
------------------------------
6D305B5CPW10
6D3069DCTS31
已选择13行。
SQL>
根据以上查询输出,我们可以看到enqueueresourcestructure由locktype和两个参数组成.Oracle用两个字符符号例如(TX,TM,TS,MR,RT,etc)表示locktype.ID1,ID2两个参数由于locktype的不同所以具有不同含义.
具体可以参见<
在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<
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>0
orderbyinst_id,cum_wait_time
/
下面就最常见的一些enqueue等待事件进行讨论.
WaitforTXEnqueueinMode6
对于TXenqueueinmode6的等待是最常见的enqueuewait
(InOracleDatabase10g,thewaiteventnameisenq:
TX—rowlockcontention.).当一个事物试图update或delete一行或多行已经被另一个事物锁定的记录时这个等待事件发生.通常这是由应用程序引起的.
eg.
在SessionA中:
updateasetobject_id=0whereobject_id=11;
与此同时在SessionB中执行相同的语句,SessionBishung:
updateasetobject_id=0whereobject_id=11;
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='TX'
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)='TX'
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说起.
SQL>selectdbms_rowid.ROWID_RELATIVE_FNO(rowid)file_no,
2dbms_rowid.ROWID_BLOCK_NUMB
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Enqueue 整理总结 整理 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)