Oracle等待事件Enqueue CI:Cross Instance Call Invocation

"Cross Instance call Enqueue"是一种在一个或多个instance实例间调用后台进程行为时用到的队列锁,具体调用的后台进程行为包括检查点checkpoint、日志切换logfile switch、shutdown实例、载入数据文件头等等。需要注意的是这种Enqueue Lock并不仅仅在RAC中使用,即便是单节点也会用到。CI锁的数量取决于并行执行Cross Instance Call调用的进程的总数。

SQL> col ksqsttyp for a20
SQL> col ksqstrsn for a20
SQL> col ksqstexpl for a80
SQL> set linesize 200 pagesize 2000;
SQL> select ksqsttyp,ksqstrsn,ksqstexpl from x$ksqst where ksqsttyp='CI';

KSQSTTYP             KSQSTRSN             KSQSTEXPL
-------------------- -------------------- --------------------------------------------------------------------------------
CI                   contention           Coordinates cross-instance function invocations

SQL> show parameter cluster_database

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cluster_database                     boolean     FALSE
cluster_database_instances           integer     1


SQL> select * from v$enqueue_stat where eq_type='CI';

   INST_ID EQ TOTAL_REQ# TOTAL_WAIT#  SUCC_REQ# FAILED_REQ# CUM_WAIT_TIME
---------- -- ---------- ----------- ---------- ----------- -------------
         1 CI        595           0        595           0             0

当系统中出现有大量这种跨实例后台进程调用时,将出现CI队列锁的争用。假设在一个RAC场景中,同时有大量的回话开始对不同的数据表执行TRUNCATE截断操作,TRUNCATE的一个前提是在所有实例上(因为对象表的dirty buffer可能分布在多个实例上)发生对象级别的检查点(object level checkpoint),检查点发生时CKPT进程会通知DBWR写出指定对象表相关的脏块,DBWR需要扫描Buffer Cache以找出脏块,而如果Buffer Cache很大那么扫描将花费大量的时间,而在此过程中前台进程将一直排他地持有着本地的CI队列锁,这就将造成CI锁的严重争用。 为了减少CI队列锁地争用,我们第一步所要做的是找出实际的Cross Instance call跨实例调用的类型。这里要另外提一下的是在10g以前不管是v$session_wait或statspack中都不会将enqueue锁等待事件的具体enqueue lock类型写明,一般需要我们从p1/p2/p3列中找出enqueue的具体身份,例如"WAIT #1: nam='enqueue' ela= 910796 p1=1128857606 p2=1 p3=4",这里的p1为1128857606也就是16进制的43490006,高位的'4349'转换为ascii码也就是'CI',而这里的p2/p3对应为V$lock中的ID1/ID2,ID1=1代表了"Reuse (checkpoint and invalidate) block range",ID2=4代表了"Mounted excl, use to allocate mechanism"。 具体ID1/ID2代表的含义在不同版本中有所变化,可以参考下表:
Id1, Id2 Combination: Oracle 10gR1 27 TO 29 *Same as 9i R2 30 process waiters after row cache requeue 31 Active Change Directory extent relocation 32 block change tracking state change 33 kgl mulitversion obsolete 34 set previous resetlogs data 35 set recovery destination pointer 36 fast object reuse request 37 test ksbcic() 38 ASM diskgroup discovery wait 39 ASM diskgroup release 40 ASM push DB updates 41 ASM add ACD chunk 42 ASM map resize message 43 ASM map lock message 44 ASM map unlock message (phase 1) 45 ASM map unlock message (phase 2) 46 ASM generate add disk redo marker 47 ASM check of PST validity 48 ASM offline disk CIC 49 Logical Standby Sync Point SCN 50 update SQL Tuning Base existence bitvector 51 PQ induced Checkpointing 52 ASM F1X0 relocation 53 Scheduler autostart 54 KZS increment grant/revoke counter 55 ASM disk operation message 56 ASM I/O error emulation 57 DB Supp log cursor invalidation 58 Cache global range invalidation 59 Cache global object invalidation 60 ASM Pre-Existing Extent Lock wait 61 Perform a ksk action through DBWR 62 ASM diskgroup refresh wait Oracle 10gR2 30 to 62 *Same as 10gR1 63 KCBO object checkpoint 64 KCBO object pq checkpoint 65 global health check event 66 Oracle Label Security refresh 67 thread internal enable 68 cross-instance registration 69 KGL purge unused subheaps 70 clear pin instance flag 71 Rolling operations CIC Oracle 9iR2 Id1 Meaning ~~~ ~~~~~~ 25 TO 26 *Same as 9i R1 27 set Database Force Logging mode 28 invalidate cached file address translations 29 Cursor Unauthorize Mode 30 snapshot too old diagnosis 31 process waiters after row cache requeue Oracle 9iR1 Id1 Meaning ~~~ ~~~~~~~~ 18 TO 24 *Same as Oracle 8i 25 Update Dscn Tracking (ktcndt) 26 Purge dictionary Object number Cache Oracle 8i Id1 Meaning ~~~ ~~~~~~~ 0 TO 17 *Same as Oracle 8(please see "Oracle8*" for the Meaning) 18 Object reuse request 19 Rolling release checks 20 Propagate begin backup scn for a file 21 Refresh top plan (for db scheduler) 22 Clear checkpoint progress record 23 Drop temp file 24 Quiesce database Restricted Id2 Meaning ~~~ ~~~~~~~ 0x01 Used to pass in parameters 0x02 Used to invoke the function in backgroud process 0x03 Used to indicate the foreground has not returned 0x04 Mounted excl, use to allocate mechanism 0x05 Used to queue up interested clients Oracle 8* Id1 Meaning ~~~ ~~~~~~~ 0 Checkpoint block range 1 Reuse (checkpoint and invalidate) block range 2 LGWR Checkpointing and Hot Backup 3 DBWR syncronization of SGA with control file 4 Log file add/drop/rename notification 5 Write buffer for CR read 6 Test call 7 Invalidate KCK cache in all instances 8 Alter rollback segment optimal 9 Signal Query Servers/coordinator 10 Create Remote parallel query Server 11 Set Global Partitions 12 Stop Disk Writes 13 Drop Sort Segments 14 Release unused space from Sort Segments 15 Instance Recovery for Parallel operation Group 16 Validate parallel slave Lock Value 17 Check transaction state objects 18 Flush blocks in object 19 Rolling release checks 20 Propagate begin backup scn for a file 21 Clear checkpoint progress record Oracle 7 Id1 Meaning ~~~ ~~~~~~~ 0 Flush buffers for reuse as new class 1 LGWR checkpointing and Hot Backup 2 DBWR synchronization of SGA with control file 3 Log file add/drop/rename notification 4 Write buffer for CR read 5 Test Call 6 Invalidate KCK cache in all instances 7 Alter rollback segment optimal 8 Signal Query Servers/coordinator 9 Create Remote Parallel Query Server 10 Set Global Partitions 11 Stop Disk Writes 12 Drop Sort Segments 13 Release unused space from Sort Segments 14 Instance Recovery for Parallel operation Group 15 Validate parallel slave Lock Value 16 Check Transaction State Objects Id2 Meaning ~~~ ~~~~~~~ 1 Pass in Parameters 2 Invoke the call in background process 3 Foreground has not returned yet 4 Used to allocate the CI call 5 Used to queue up interested clients 

你可能感兴趣的:(oracle,数据库,Lock,ENQUEUE)