Oracle Study中Oracle等待事件怎么用
这篇文章主要为大家展示了“Oracle Study中Oracle等待事件怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle Study中Oracle等待事件怎么用”这篇文章吧。
Oracle Study之--Oracle等待事件
什么是enqueue
enqueue可以做名词,也可以做动词来解释。做名词时,指的的是一种锁的类型,比如Txenqueue。做动词时,则是指将锁请求放入到请求队列的操作。
我们知道,lock是一种需要排队的锁实现机制,这和latch是不一样的,latch是一种轻量级的锁,是不需要排队得。Enqueue就是lock的排队机制的实现。
lock是用来实现对于共享资源的并发访问的。如果两个session请求的lock是兼容的,则可以同时锁定资源,如果两个session请求的lock是不兼容的,则其中一个session必须等待另外一个session释放其持有的lock后,才能获得对共享资源的锁定。这时,等待的session的lock请求就需要进入到一个队列当中,这就是enqueue等待。
什么是enqueue resource
Lock有三种可能的状态:已获得,转换或者等待。对于某一个lock,可能一些session已经获得该lock,某些session请求转换,也有某些session在请求持有但无法成功而导致等待。所以,对于一个lock,需要三个队列来描述这些session的状态。这个三个队列,分别称为Owner,waiter和convert队列,由一个结构来管理,就是enqueue resource。
enqueue是有名字的,其名字就是对应的lock的类型加上ID1,ID2参数构成,形如<TYPE-ID1-ID2>。Enqueue resource的结构,其头部是该enqueue的名字,然后就是指向三个队列的指针。
通过v$resource视图可以查看当前系统中的enqueue。
由于系统中有很多类型的lock同时存在,那么enqueue resource结构实际上是一个数组,其长度由隐含参数_enqueue_resources控制,也就是说,该参数控制了系统中可同时存在的lock的数量。如果超过,则会报以下错误:
ORA-00052: "maximum number of enqueue resources exceeded"
通过v$resource_limit视图可以查看系统中各种资源的利用情况。
什么是enqueue lock
enqueue lock就是lock本身。oracle使用了和enqueue reouserce分离的另外一个数组来管理enqueue lock,这个数组的长度由隐含参数_enqueue_locks控制。
通过视图v$enqueue_lock可以查看该数组中的具体内容。
什么是enqueue hash
通过上面关于enqueue resource的描述,我们可以知道,oracle查找一个lock时,需要先在enqueue resource数上查找到该lock的位置。
如果每次都在数组上顺序查找,显然效率较低。我们知道hash是一种高效的查找算法,所以oracle对于enqueue resource的查找也采用了hash方式,引入了一个hash数组,其大小由隐含参数_enqueue_hash控制。
通过对enqueue的名字<TYPE-ID1-ID2>进行hash计算,得到的结果就是某个enqueue resource在hash数组中的位置,也就是定位到了具体的hash bucket。如果多个enqueue resource的hash值相同,则在同一个bucket中形成一个链表。
相应的,为了保护这个hash数组,需要引入一个latch:enqueue hash chain。该latch有若干个子latch,由隐含参数_enqueue_hash_chain_latches控制
什么是enqueue freelist
同样的,对于enqueue resource数组中的空闲位置,需要通过一个freelist列表来管理,这样每次在请求新的位置时,不至于要扫描整个数组。enqueue freelist由enqueues latch的保护。
实际上,enqueue resource的Hash管理方式,和buffer cache/library cache的管理方式非常的相像。如果想更深入的了解enqueue hash,resource和lock,可以dump出具体的结果看看:
alter session set events ’immediate trace name enqueues level 3’;
Enqueue
Enqueue 这个词其实是lock 的另一种描述语。
当我们在AWR 报告中发现长时间的enqueue 等待事件时,说明数据库中出现了阻塞和等待,可以关联AWR报告中的enqueue activity部分来确定是哪一种锁定出现了长时间等待。
这个等待事件有2个参数:
Name: enqueue 的名称和类型。
Mode: enqueue的模式。
可以使用如下SQL 查看当前会话等待的enqueue名称和类型:
SELECTevent,CHR(TO_CHAR(BITAND(p1,-16777216))/16777215)||CHR(TO_CHAR(BITAND(p1,16711680))/65535)"Lock",TO_CHAR(BITAND(p1,65535))"Mode"FROMv$session_waitWHEREeventlike'enq%';
Oracle 的enqueue 包含以下模式:
模式代码解释1Null(NULL)2Row-S(SS)3Row-X(SX)4Share(S)5S/Row-X(SSX)6Exclusive(X)
Oracle的enqueue 有如下类型:
Enqueue缩写缩写解释BLBufferCachemanagementBRBackup/RestoreCFControlfiletransactionCICross-instanceCallInvocationCUBindEnqueueDFDatafileDLDirectLoaderIndexCreationDMDatabaseMountDRDistributedRecoveryProcessDXDirstributedTransactionFPFileObjectFSFileSetHWHigh-waterLockINInstanceNumberIRInstanceRecoveryISInstanceStateIVLibraryCacheInvalidationJIEnqueueusedduringAJVsnapshotrefreshJQJobQueueKKRedoLog“Kick”KOMultipleObjectCheckpointL[A-p]LibraryCacheLockLSLogstartorswitchMMMountDefinitionMRMediarecoveryN[A-Z]LibraryCachebinPEAltersystemsetparameter=valuePFPasswordfilePIParallelslavesPRProcessstartupParallelslavesynchronizationQ[A-Z]RowCacheROObjectReuseRTRedoThreadRWRowWaitSCSystemCommitNumberSMSMONSequenceNumberSQSequenceNumberEnqueueSRSynchronizedreplicationSortsegmentSTSpacemanagementtransactionSVSequencenumberValueTATransactionrecoveryTCThreadCheckpointTEExtendTableTMDMLenqueueTOTemporaryTableObjectEnqueueTSTemporarySegement(alsoTableSpace)TTTemporaryTableTXTransactionULUser-definedLocksUNUsernameUSUndosegment,SerializationWLBeingWrittenRedoLogXAInstanceAttributeLogXIInstanceRegistrationLock
案例分析:
12:54:01SYS@prod>connscott/tigerConnected.12:54:05SCOTT@prod>select*fromtab;TNAMETABTYPECLUSTERID-----------------------------------------------BONUSTABLEDEPTTABLEDEPT1TABLEEMPTABLESALGRADETABLET1TABLE6rowsselected.12:54:09SCOTT@prod>grantallondept1totom;Grantsucceeded.Elapsed:00:00:00.3712:54:23SCOTT@prod>updatedept1setdname='beijing'wheredeptno=10;2rowsupdated.Elapsed:00:00:00.0412:54:41SCOTT@prod>rollback;Rollbackcomplete.Elapsed:00:00:00.0312:55:22SCOTT@prod>updatedept1setdname='NetWork'wheredeptno=10;2rowsupdated.Elapsed:00:00:00.0212:54:51SYS@prod>conntom/tomConnected.12:54:56TOM@prod>updatescott.dept1setloc='hongkong'wheredeptno=10;12:59:18SYS@prod>coleventfora5012:59:26SYS@prod>r1SELECTevent,CHR(TO_CHAR(BITAND(p1,-16777216))/16777215)2||CHR(TO_CHAR(BITAND(p1,16711680))/65535)3"Lock",4TO_CHAR(BITAND(p1,65535))"Mode"5FROMv$session_wait6*WHEREeventlike'enq%'EVENTLockMode----------------------------------------------------------------------------------------enq:TX-rowlockcontentionTX6Elapsed:00:00:00.0113:22:48SYS@prod>selecta.ORACLE_USERNAME,a.SESSION_ID,b.TYPE,b.LMODE,b.REQUEST,b.block,o.object_namefromv$locked_objecta,v$lockb,dba_objectso2*wherea.session_id=b.sidanda.object_id=o.object_idORACLE_USERNAMESESSION_IDTYLMODEREQUESTBLOCKOBJECT_NAM----------------------------------------------------------------------------------SCOTT42TX601DEPT1TOM38TM300DEPT1SCOTT42TM300DEPT1TOM38TX060DEPT1TOM38AE400DEPT1SCOTT42AE400DEPT16rowsselected.
以上是“Oracle Study中Oracle等待事件怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。