面试宝典:介绍下Oracle数据库动态性能视图 V$RESOURCE

在这里插入图片描述
好的,我们来深入解析 Oracle 19C 数据库中的 V$RESOURCE 动态性能视图。这是一个非常核心的视图,用于理解 Oracle 的锁机制和并发控制。

📖 概述与作用

V$RESOURCE 视图记录了当前数据库实例中所有可被锁定的资源(Enqueue Resources)的信息。Enqueue(队列锁)是 Oracle 用于管理并发访问共享资源(如数据行、表、事务等)的一种高级锁机制。每当一个会话需要以某种模式(如共享、独占)锁定一个资源时,就会在该资源上创建一个 Enqueue。

简单来说,V$RESOURCE 视图回答了 “系统里有哪些东西可以被锁?” 这个问题。它列出了所有已曾被请求或当前正被持有的锁资源(如事务、表、数据块等)的唯一标识。而每个资源上的具体锁请求(会话、模式、等待情况)则记录在 V$LOCK 视图中。

🎯 使用场景

  1. 高级锁诊断与故障排除:当发生严重的锁等待(enqueue wait)时,例如 enq: TX - row lock contentionenq: TM - contention,DBA 可以通过 V$RESOURCEV$LOCK 关联查询,精确定位是哪个特定资源(例如,哪个事务ID、哪个表)导致了阻塞。
  2. 并发性能分析:监控系统中锁资源的创建数量和类型,可以帮助评估应用的并发特性和锁竞争强度。
  3. RAC 环境下的全局锁管理:在 Oracle Real Application Clusters (RAC) 环境中,GV$RESOURCE 视图可以显示所有实例中的锁资源信息,对于诊断跨实例的锁争用至关重要。

📊 字段含义详解

下表详细说明了 V$RESOURCE 视图中的各个字段。注意:许多字段包含的是内部地址或转换后的数值,需要与其他视图关联才有实际意义。

字段名数据类型含义与说明
RESOURCE_NAMEVARCHAR2(30)资源名称的前缀(或类型)。这是一个两字符的标识符,代表锁的类型。常见的有:
TX:事务锁(Transaction Lock)
TM:表锁(DML Enqueue / Table Lock)
UL:用户自定义锁(User Lock)
TS:表空间锁(Tablespace Lock)
SQ:序列号锁(Sequence Lock)
RESOURCE_IDRAW(4)资源的唯一标识符(ID1)。与 V$LOCK 中的 ID1 字段对应。其含义根据 RESOURCE_NAME 而变化:
对于 TX 锁RESOURCE_ID 是事务 ID 的一部分,可转换为回滚段号、槽位号、序列号。
对于 TM 锁RESOURCE_ID 就是被锁定的表的 对象ID(OBJECT_ID)
RESOURCE_TYPENUMBER资源的内部类型编号。这是一个 Oracle 内部的映射,通常通过 RESOURCE_NAME 来理解类型更为直观。
CURRENT_USERSNUMBER当前以非空模式(即非NULL模式)持有该资源的会话数。NULL 模式表示会话正在等待该资源。这个数字反映了当前真正持有该资源锁的会话数量。
INITIAL_ALLOCATIONVARCHAR2(10)资源的初始分配方式。通常是 PERMANENT(永久的),表示该资源结构体是在共享池(Shared Pool)中永久分配的。
LIMIT_VALUENUMBER该类型资源的最大可分配数量。对于大多数 Enqueue 资源,此值通常为 0,表示没有预定义的限制(仅受 SGA 大小限制)。
OWNER_NODENUMBER(RAC 中重要)拥有该资源的主控节点的标识符。在单实例数据库中,此值为 0。在 RAC 中,它指示哪个实例主要负责管理此资源的锁。
CON_IDNUMBER容器ID。在多租户环境(CDB)中,标识该行数据所属的容器。可能值包括:
0:表示数据属于整个 CDB。
1:表示数据属于根容器(CDB$ROOT)。
n (n>1):表示数据属于特定可插拔数据库(PDB)的 ID。

🔗 相关视图与基表

  • 核心相关视图

    • V$LOCK:这是与 V$RESOURCE 最重要的关联视图。V$RESOURCE 描述了 “资源本身”,而 V$LOCK 描述了 “会话对资源的请求”(即谁以什么模式持有或等待哪个资源)。通过 (RESOURCE_NAME, RESOURCE_ID)V$LOCK(TYPE, ID1) 字段进行关联。
    • V$SESSION:提供持有或等待锁的会话的详细信息(如用户名、机器、程序)。
    • V$ENQUEUE_STAT:显示各类 Enqueue 的统计信息(获取次数、等待次数等)。
    • DBA_OBJECTS:当 RESOURCE_NAME 为 ‘TM’ 时,通过 RESOURCE_ID (即 OBJECT_ID) 关联此视图可以查到被锁定的表名。
    • GV$RESOURCE:在 RAC 环境中,显示所有实例的 V$RESOURCE 信息。
  • 关于基表
    V$RESOURCE 是一个 **动态性能视图(V视图)∗∗。它的底层数据来源于实例运行时∗∗系统全局区(SGA)中的内存结构∗∗。这些内存结构(哈希桶、链表)用于高效地管理和跟踪所有的Enqueue资源。其底层基表通常是∗∗‘X视图)**。它的底层数据来源于实例运行时**系统全局区(SGA)中的内存结构**。这些内存结构(哈希桶、链表)用于高效地管理和跟踪所有的 Enqueue 资源。 其底层基表通常是 **`X视图)。它的底层数据来源于实例运行时系统全局区(SGA)中的内存结构。这些内存结构(哈希桶、链表)用于高效地管理和跟踪所有的Enqueue资源。其底层基表通常是XKSQRS** 或类似的 X‘表。这些‘X` 表。这些 `X表。这些X 表是内存结构的接口,由 Oracle 内核维护,对用户而言是隐藏的、未公开的,并且直接查询它们既复杂也不被支持。V$RESOURCE` 提供了对这些底层数据的安全、友好的访问方式。

⚙️ 底层原理与知识点

1. Enqueue (队列锁) 机制:
Enqueue 是一种复杂的锁结构,用于保护共享资源。它允许并发会话以不同的模式(如 NULL, SS, SX, S, SSX, X)锁定同一资源,并妥善处理它们之间的兼容性。V$RESOURCE 代表了被保护的资源实体

2. 资源名称(RESOURCE_NAME)的解码:
这是理解锁类型的关键。最常见的两种是:

  • TX (Transaction Lock):当一个事务修改数据时,它会在受影响的行上获得一个 TX 锁。RESOURCE_ID 对应的是事务的详细信息。
  • TM (DML Enqueue / Table Lock):当执行 DML 语句(INSERT, UPDATE, DELETE)时,为了防止在操作过程中表的结构被更改(如 DDL),会话会在表级别获得一个 TM 锁。RESOURCE_ID 直接就是表的 OBJECT_ID

3. 与 V$LOCK 的关系:
这是最重要的概念。可以将锁系统理解为:

  • V$RESOURCE:代表被锁的客体(例如,一把锁的锁芯)。
  • V$LOCK:代表锁的主体(例如,谁拿着钥匙插入了锁芯,以及他是想打开它(共享)还是锁上它(独占))。
    一个资源(V$RESOURCE 中的一行)可以对应多个锁请求(V$LOCK 中的多行)。

4. 事务与 TX 锁:
TX 锁的 RESOURCE_ID (即 ID1) 是一个需要解码的数值。可以通过以下查询将其转换为人类可读的事务信息(回滚段号、槽位号、序列号):
SELECT TRUNC (id1 / POWER (2, 16)) AS usn, BITAND (id1, TO_NUMBER ('ffff', 'xxxx')) + 0 AS slot, id2 AS seq FROM v$lock WHERE type = 'TX';

🛠️ 常用查询 SQL

  1. 查找当前被锁定的表(TM 锁)及相关信息
    此查询将 V$RESOURCE (TM类型) 与 DBA_OBJECTSV$LOCK 关联,找出正在被DML操作锁定的表。
SELECT
    r.resource_name,
    r.resource_id,
    o.owner || '.' || o.object_name AS locked_object,
    o.object_type,
    l.sid,
    s.serial#,
    s.username,
    s.osuser,
    s.machine,
    l.lmode,
    l.request
FROM
    v$resource r
JOIN
    v$lock l ON (r.resource_name = l.type AND r.resource_id = l.id1)
JOIN
    dba_objects o ON (r.resource_id = o.object_id)
JOIN
    v$session s ON (l.sid = s.sid)
WHERE
    r.resource_name = 'TM' -- 只查看表锁
    AND l.type = 'TM';
  1. 查看所有类型的活跃锁资源
    这是一个概览查询,查看系统中有哪些类型的锁资源被创建了。
SELECT
    resource_name,
    COUNT(*) AS resource_count,
    SUM(current_users) AS total_current_users
FROM
    v$resource
GROUP BY
    resource_name
ORDER BY
    resource_count DESC;
  1. 诊断特定的 TX 锁等待(阻塞事务)
    当发生 enq: TX - row lock contention 等待时,此查询可以帮助找到阻塞者。
SELECT
    'Blocking -> Waiting' AS status,
    r.resource_name,
    r.resource_id,
    l.sid,
    s.serial#,
    s.username,
    s.status AS session_status,
    l.lmode,
    l.request,
    'ALTER SYSTEM KILL SESSION ''' || l.sid || ',' || s.serial# || ''' IMMEDIATE;' AS kill_command
FROM
    v$resource r
JOIN
    v$lock l ON (r.resource_name = l.type AND r.resource_id = l.id1)
JOIN
    v$session s ON (l.sid = s.sid)
WHERE
    r.resource_name = 'TX'
    AND l.block > 0 -- 查找阻塞其他会话的锁

UNION ALL

SELECT
    'Waiting        ' AS status, -- Added spaces for alignment in output
    r.resource_name,
    r.resource_id,
    l.sid,
    s.serial#,
    s.username,
    s.status AS session_status,
    l.lmode,
    l.request,
    NULL AS kill_command
FROM
    v$resource r
JOIN
    v$lock l ON (r.resource_name = l.type AND r.resource_id = l.id1)
JOIN
    v$session s ON (l.sid = s.sid)
WHERE
    r.resource_name = 'TX'
    AND l.request > 0 -- 查找正在请求锁的等待会话
ORDER BY
    resource_id, status DESC;

💎 总结

V$RESOURCE 是 Oracle 数据库锁管理体系的核心视图之一,它记录了所有活跃的、可被锁定的资源实体。它的主要价值在于:

  • 资源标识:与 V$LOCK 结合,为高级锁诊断提供目标对象(哪个表、哪个事务被锁定了)。
  • 系统状态洞察:反映了系统的并发活动和潜在的资源竞争热点。
  • RAC 全局视角:在集群环境中,对于理解跨实例的锁分布至关重要。

理解 V$RESOURCEV$LOCK 的区别与联系(资源 vs. 请求)是掌握 Oracle 锁机制的关键。在实际故障排查中,它们几乎总是被联合查询。

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值