最近在读韩国的Oracle ACE赵东郁(Dion Cho)的《高级OWI与Oracle性能调整》一书,书中介绍了Oracle等待事件以及调优相关内容,虽然是基于10g和以前版本写的,但其知识的深度和系统化程度,对最新12c版本依然有非常高的参考价值。 我将在以后的一系列文章中介绍阅读该书过程中的所知、所得并适当地结合最新版本内容进行延伸。
Oracle数据库为了防止多个进程或会话对同一数据或资源进行操作时相互影响而提供了一系列的锁机制(Locking Mechanism)。
首先,按照锁的用途可以分为DML锁、DDL锁和系统内部锁,如在线文档的下图:
参考: Database Concepts 12.2 http://t.cn/RK9p2xJ >Overview of the Oracle Database Locking Mechanism
另外,根据锁的实现机制,锁可以分为以下内容:
・Enqueue・Latch・Mutex・其他 -Dictionary cache lock (row cache lock) -Library cache lock & Library cache pin -Buffer Lock
Enqueue(排队)是Oracle锁机制中最普遍的一种实现方式,其主要特点是通过Enqueue结构进行管理,并且遵循一定的排队机制,按请求顺序提供服务(FIFO)。
Enqueue锁的资源标识符通常为以下形式:
<ResourceType - ID1 - ID2 - ID3 - ID4>
ID1~ID4的意义根据资源(ResourceType)的类型而不同。
ID1和ID2的含义可以通过V$LOCK_TYPE视图的ID1_TAG、ID2_TAG进行查看; ID3和ID4是12.1版本之后追加的项目,基本没有相关说明但一般是CDB相关的内容。
Enqueue的模式(MODE)和共享性
Oracle 通过Enqueue来保护多个进程(会话)对共享资源的访问。对于每个进程(会话)在访问共享资源时,都会请求或者持有一个类型的Enqueue锁和Enqueue模式,然后Oracle会根据Enqueue锁和其模式的共享性来控制资源的访问。
通过V$LOCK视图的LMOD列和REQUES列中的定义,我们可以看到Enqueue锁的模式包括以下内容:
参考: Database Reference 12.2 http://t.cn/RKdVlrV 8.40 V$LOCK LMODE Lock mode in which the session holds the lock: REQUEST Lock mode in which the process requests the lock: 0 - none 1 - null (NULL) 2 - row-S (SS) 3 - row-X (SX) 4 - share (S) 5 - S/Row-X (SSX) 6 - exclusive (X)
本质来讲,Enqueue锁的模式并没有什么实质的意义,只是利用其相互的共享性控制资源访问而已。其关键点在于各个Enqueue锁模式间的共享性。
以下是Enqueue锁模式间的共享性关系: (○为可共享;☓为不可共享)
对于RAC环境,Enqueue的模式(MODE)和共享性也非常相似:
Enqueue资源构造体存储在共享池区域,并通过HASH链表进行管理。 我们可以通过以下图,概要地理解一下Enqueue的整体:
通过上面的图,我们可以看到Enqueue实现包括以下的组成部分:
1.Enqueue资源标识符信息 针对需要保护资源的唯一标识符。
2.Hash 表 用于搜索Enqueue资源构造体的Hash 表,由Hash Bucket组成,通过Hash算法块数定位所需要的Enqueue资源构造体。
3.Enqueue资源构造体 Enqueue针对每个其保护的资源会分配一个资源构造体,而这些资源构造体通过链表链接在Hash 表的各个Bucket上。
每个Enqueue资源构造体主要包括以下信息:
・Enqueue资源标识符信息 ・拥有锁的进程(会话)列表 (Owners) ・正在等待锁的进程(会话)列表 (Waiters) ・正在等待锁转换的进程(会话)列表(Converters) (需要从一种锁模式转换为另一种锁模式)
实例启动时预先分配的Enqueue资源构造体个数由隐含参_enqueue_resources来决定,分配了的Enqueue资源构造体可以通过V$RESOURCE视图进行查看。
4.锁构造体 系统分配的锁相关信息,主要包括锁的模式等信息。 实例启动时预先分配的锁构造体个数由隐含参数_enqueue_locks来决定,分配了的锁构造体可以通过V$ENQUEUE_LOCK视图进行查看。
5.共通空闲列表(Common Free List) 实例整体中没有被使用的空闲Enqueue资源构造体由共通空闲列表(Common Free List)管理; 例如预先分配且还没有使用的空闲Enqueue资源构造体。
6.本地空闲列表(Local Free List) 本地空闲列表(Local Free List)针对每个Hash Bucket链表中的空闲Enqueue资源构造进行管理;
例如使用后被释放的Enqueue资源构造体,会被链接到本地空闲列表(Local Free List),在下次需要新的Enqueue资源构造体,优先使用。 当本地空闲列表中没有可用的资源构造体时,从共通空闲列表进行分配。
7.Latch:enqueue hash chains Oracle通过Latch: Enqueue Hash Chains来保护相关Hash Buckets,即在获得和释放Enqueue时,检索本地空闲列表(Local Free List)时都需要首先获得Latch: Enqueue Hash Chains。 Latch:enqueue hash chains的个数由由隐含参数_enqueue_resources来决定,默认等于cpu_count数。
8.Latch:enqueue 共通空闲列表由Latch:enqueue来保护,即对共通空闲列表操作时首先要获得Latch:enqueue。 每个实例仅有一个Latch:enqueue。
对于Enqueue锁的操作主要包括三种:获取 (get)、转换(convert)、释放(release)。
当某进程(会话)需要对某资源进行操作时,首先需要获得相关的Enqueue锁;Enqueue锁的获取过程可参考如下图:
当某个进程(会话)对特定的资源需要Enqueue锁保护时,会根据Enqueue锁的资源标识符的哈希(Hashing)计算结果,找到该Enqueue资源构造体所在的Bucket(一个Bucket可能对应多个资源构造体),进而找到该Enqueue资源构造体;然后根据锁的情况自动地链接到列表(Owners或Waiters或Converters)中。
其他
1.持有锁的进程(Owners)结束对Enqueue锁的使用后会释放Enqueue锁,并通知在等待列表中的进程(Waiters); 另外,当进程链接到等待列表(Waiters)时会开始计时,如果Enqueue等待超时(通常3秒),等待进程会自动苏醒并确认持有锁的进程(Owners)是否依然存在,如果存在则继续等待。
2.在等待进程苏醒时还会检测是否发生了死锁; 而死锁检测间隔还会受隐含参数_enqueue_deadlock_scan_secs来控制,即:死锁检测时间间隔=Enqueue等待超时(通常3秒) +_enqueue_deadlock_scan_secs(12c默认为0)。
SQL> col Parameter format a30 SQL> col Description format a30 SQL>col Value format a10 SQL> SQL> select a.ksppinm "Parameter", a.KSPPDESC "Description",b.ksppstvl "Value" from x$ksppi a, x$ksppcv b where a.indx = b.indx and a.ksppinm like '%_enqueue_deadlock_scan_secs%'; Parameter Description Value ------------------------------ ------------------------------ ---------- _enqueue_deadlock_scan_secs deadlock scan interval 0
3.在获得Enqueue锁而等待期间,进程会根据资源的类型等待 enq: enqueue_type - related_details。
而10g之后的版本对于同一类型的enqueue也会根据情况对等待事件进行区分,例如下面介绍的TX类型的enqueue等待:
Database Performance Tuning Guide 12.2 http://t.cn/RKD5CAR >10.3.7 enqueue (enq:) waits >The name of the enqueue is included as part of the wait event name, in the form enq: enqueue_type - related_details. In some cases, the same enqueue type can be held for different purposes, such as the following related TX types: > >enq: TX - allocate ITL entry >enq: TX - contention >enq: TX - index contention >enq: TX - row lock contention
在后续的文章中,我将继续对相关系列进行介绍。
TeacherWhat:
用碎片化的时间,一点一滴地学习一套系统化的知识。