
好的,我们来对 Oracle 19C 数据库中的 V$CACHE_LOCK 动态性能视图进行一次全面、深入的解析。
这个视图是深入理解 Oracle Real Application Clusters (RAC) 中缓存融合 (Cache Fusion) 机制和全局缓存服务 (GCS) 锁争用的关键工具。
1. 作用与简介
核心作用:
V$CACHE_LOCK 动态性能视图用于显示当前实例的缓冲区缓存中,每个被持有的PCM(Parallel Cache Management)锁的详细信息。这些锁不是传统的 DML 锁(如 TM、TX),而是 RAC 环境中 GCS 为了管理多个实例对同一数据块的并发访问而维护的全局资源锁。
背景知识:
- PCM 锁 (Cache Fusion 锁): 在 RAC 中,每个数据块在任何时候都关联着一个全局分布的锁资源。这个锁用于协调哪个实例可以以何种模式(NULL、共享、独占)访问该块,并跟踪块的最新版本。
- 全局缓存服务 (GCS): 负责维护和管理这些 PCM 锁。它是缓存融合架构的大脑。
- 锁模式: PCM 锁主要有三种模式:
- N (Null): 实例可以读取块的当前镜像的只读副本,但不能修改它。
- S (Shared): 实例可以并发地读取块的当前镜像。
- X (Exclusive): 实例可以修改块。持有 X 锁的实例拥有块的"当前"版本。
V$CACHE_LOCK 提供了这些关键锁资源的实时快照。
2. 使用场景
-
诊断全局缓存争用 (Global Cache Contention):
- 当 RAC 数据库出现
gc buffer busy acquire,gc buffer busy release,gc current block busy等等待事件时,此视图是首要的调查点。它可以定位到具体是哪个文件、哪个块(FILE#,BLOCK#)正在被频繁争用。
- 当 RAC 数据库出现
-
分析热点块 (Hot Blocks):
- 通过查询特定块的锁状态,可以识别出导致大量全局缓存传输的热点对象,从而进行针对性优化(如分区、使用反向键索引等)。
-
理解缓存融合行为:
- 通过查看锁的持有模式(
MODE_HELD)和请求模式(MODE_REQUESTED),可以深入理解当前实例在集群中对数据块的访问权限和意图。
- 通过查看锁的持有模式(
-
死锁或阻塞分析:
- 虽然PCM锁的设计避免了传统的死锁,但
BLOCKING和XNC字段可以帮助识别复杂的转换争用场景。
- 虽然PCM锁的设计避免了传统的死锁,但
3. 字段含义详解
V$CACHE_LOCK 视图中的每一行代表一个当前实例正在持有的 PCM 锁。以下是其核心字段:
| 字段名 | 数据类型 | 含义 |
| :— | :— | :— |
| FILE# | NUMBER | 该PCM锁所保护的数据块所在的数据文件编号。 |
| BLOCK# | NUMBER | 该PCM锁所保护的数据块在数据文件中的编号。与 FILE# 共同唯一标识一个被锁定的资源。 |
| STATUS | VARCHAR2(1) | 锁的状态(已废弃,通常为O,表示OPEN)。 |
| SCOPE | VARCHAR2(1) | 锁的作用域(已废弃,通常为G,表示GLOBAL)。 |
| MODE_HELD | VARCHAR2(1) | 当前实例对该资源持有的锁模式。这是最重要的字段之一。 |
| | | • N: NULL 模式。 |
| | | • S: Shared 模式。 |
| | | • X: Exclusive 模式。 |
| MODE_REQUESTED | VARCHAR2(1) | 最初请求的锁模式。通常与 MODE_HELD 相同。 |
| BLOCKING | NUMBER | 阻塞计数器。表示此锁资源是否正在阻塞其他实例的锁请求。0表示未阻塞,1或更大表示正在阻塞其他实例。高值或非零值表示争用。 |
| XNC | VARCHAR2(4) | 是否正在进行强转换 (eXclusive Null Check)。这是一个内部状态,通常为NULL。如果非空,可能表示正在进行复杂的锁转换,可能与争用相关。 |
| LOCK_ELEMENT_ADDR | RAW(4 | 8) | 关联的全局锁元素的内存地址。这是与GCS内部结构 V$GC_ELEMENT 关联的关键字段。 |
| LOCK_ELEMENT_NAME | RAW(8) | 关联的全局锁元素的名称。 |
| FORCED_READS | NUMBER | 强制读取的次数(已废弃)。 |
| FORCED_WRITES | NUMBER | 强制写入的次数(已废弃)。 |
4. 相关视图与基表
-
相关动态性能视图:
GV$CACHE_LOCK:V$CACHE_LOCK的全局版本,显示所有活动实例持有的PCM锁。诊断RAC问题时必须使用此视图,因为争用可能发生在任何实例上。V$GC_ELEMENT: 提供全局缓存元素(即锁主资源)的详细信息。通过LOCK_ELEMENT_ADDR或LOCK_ELEMENT_NAME与V$CACHE_LOCK关联。V$LOCK_ELEMENT: 另一个显示锁元素的视图,提供更多细节。V$CACHE/V$BH: 显示缓冲区缓存中块本身的状态信息(如XCUR,CR)。通过FILE#和BLOCK#与V$CACHE_LOCK关联,可以同时看到块的状态和其上的锁状态。DBA_EXTENTS: 通过FILE_ID和BLOCK_ID关联,可以将被锁定的块映射到具体的表、索引等段对象,这是诊断的最终目的。
-
基表 (Underlying Table):
V$CACHE_LOCK是一个动态性能视图,其数据直接来源于 SGA 中 GCS 维护的PCM锁内存结构。- 它通过查询底层未公开的 X$ 表(如
X$KJBL)来获取信息。这些X表代表了GCS维护的每个PCM锁的资源结构。严禁直接查询X$表。
5. 底层详细原理
-
PCM锁与全局资源目录 (GRD):
- 在RAC中,GCS维护着一个全局资源目录 (GRD)。GRD跟踪每个数据块资源的当前状态,包括:哪个实例持有什么模式的锁、哪个实例拥有块的当前版本(
XCUR)、哪些实例拥有块的过去镜像(CR)。 V$CACHE_LOCK中看到的每一行,都对应着GRD中一个资源锁在当前实例本地内存中的映射。它代表了当前实例对这个全局资源的"认知"和"权限"。
- 在RAC中,GCS维护着一个全局资源目录 (GRD)。GRD跟踪每个数据块资源的当前状态,包括:哪个实例持有什么模式的锁、哪个实例拥有块的当前版本(
-
锁转换与缓存融合:
- 当一个实例需要以更高模式访问一个块时(例如,从
N到X以进行修改),它会向GCS发起一个锁转换请求。 - GCS会协调这个请求。例如,如果另一个实例正以
X模式持有该锁,GCS会要求那个实例将块的最新版本通过高速互连网络发送给请求者(这就是"缓存融合"),并降级其锁模式。 - 这个过程如果遇到等待,就会在请求实例上产生
gc current block busy等等待事件。V$CACHE_LOCK中的BLOCKING字段可以反映出这种争用。
- 当一个实例需要以更高模式访问一个块时(例如,从
-
视图数据查询:
- 查询
V$CACHE_LOCK时,Oracle 会遍历当前实例SGA中所有PCM锁资源的链表,并返回其状态。由于这些锁数量巨大(每个缓存的块都对应一个),在大型系统上查询此视图可能会有显著性能开销,不应频繁进行。
- 查询
6. 常用查询SQL示例
1. 查找当前实例中正在阻塞其他实例的锁(争用核心查询)
SELECT file#, block#, mode_held, blocking
FROM v$cache_lock
WHERE blocking > 0
ORDER BY blocking DESC;
2. 在集群范围内查找热点争用块(使用GV$视图)
SELECT inst_id, file#, block#, mode_held, blocking, mode_requested
FROM gv$cache_lock
WHERE blocking > 0
ORDER BY inst_id, blocking DESC;
3. 将PCM锁与数据库对象关联(定位到表和段)
SELECT c.file#, c.block#, c.mode_held, c.blocking,
e.owner, e.segment_name, e.segment_type, e.partition_name
FROM v$cache_lock c
JOIN dba_extents e ON (c.file# = e.file_id AND c.block# BETWEEN e.block_id AND e.block_id + e.blocks - 1)
WHERE c.blocking > 0
ORDER BY c.blocking DESC;
4. 检查特定可疑数据块的锁状态 across the cluster
SELECT inst_id, mode_held, mode_requested, blocking, lock_element_addr
FROM gv$cache_lock
WHERE file# = &file_id
AND block# = &block_id
ORDER BY inst_id;
5. 按锁模式统计当前实例的锁持有情况
SELECT mode_held, COUNT(*), SUM(blocking) AS total_blocking
FROM v$cache_lock
GROUP BY mode_held
ORDER BY mode_held;
总结
V$CACHE_LOCK 是 Oracle RAC 环境中用于诊断全局缓存争用的底层核心视图。
- 核心价值:它揭示了 RAC 架构的基石——PCM 锁机制。通过它,可以将抽象的
gc buffer busy等待事件定位到具体的文件、块和数据库对象,从而进行精准优化。 - 监控重点:
BLOCKING: 这是最重要的字段。非零值直接表明争用存在。MODE_HELD: 理解实例对块的访问权限。FILE#和BLOCK#: 定位争用资源。
- 使用哲学:
- 总是使用
GV$CACHE_LOCK以获得集群全局视图。 - 总是将查询结果与
DBA_EXTENTS关联,将"块"转化为"表"或"索引",这是解决问题的最终步骤。 - 意识到查询该视图的开销,避免在性能高峰期间频繁执行。
- 结合
V$SESSION_WAIT和V$SYSTEM_EVENT视图,将等待事件与具体的锁资源联系起来,形成完整的诊断证据链。
- 总是使用
对于单实例数据库,此视图通常为空或很少使用。但在RAC性能调优中,熟练掌握 V$CACHE_LOCK 是区分普通DBA和高级RAC专家的关键技能之一。
欢迎关注我的公众号《IT小Chen》
4521

被折叠的 条评论
为什么被折叠?



