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

在这里插入图片描述
好的,我们来对 Oracle 19C 数据库中的 V$HANG_SESSION_INFO 动态性能视图进行最全面、最深入的解析。这个视图是 V$HANG_INFO 的姊妹视图,提供了关于挂起会话的更详细、更底层的诊断信息。


1. 作用与概述

V$HANG_SESSION_INFO 视图用于提供参与挂起或严重阻塞的每个会话的详细状态快照和诊断信息

  • 核心定位: 如果说 V$HANG_INFO 提供了阻塞关系的 “组织结构图” (谁阻塞谁),那么 V$HANG_SESSION_INFO 则提供了图中每个 “员工”的详细人事档案 (每个会话在挂起瞬间在做什么、等什么、有什么)。
  • 数据关联: 此视图中的会话通过 CHAIN_IDV$HANG_INFO 中的阻塞链关联。它为 V$HANG_INFO 中标识出的每个阻塞者和被阻塞者提供了深度的上下文信息。
  • 信息深度: 它包含了比 V$SESSION 更丰富、更侧重于挂起诊断的信息,例如进程状态、等待事件详情、当前持有的锁和闩锁等,这些都是定位挂起根本原因的关键线索。

2. 使用场景

此视图在以下高级诊断场景中不可或缺:

  1. 深度根因分析

    • V$HANG_INFO 识别出阻塞链的总体结构后,使用本视图深入分析链中每个关键会话的详细状态。例如,查看阻塞者会话正在执行什么SQL、持有什么类型的锁、其进程状态是否正常。
  2. 诊断复杂的资源争用

    • 对于非锁引起的挂起(如闩锁、缓冲区忙等待、库缓存争用),此视图提供了会话当前持有的资源信息(CURRENT_QUEUES, CURRENT_LATCHES),这是判断资源争用热点的直接证据。
  3. 理解会话的完整上下文

    • 它提供了会话在挂起瞬间的“全身照”,包括其操作系统进程ID、程序名、SQL地址、等待历史等,这对于全面理解问题场景至关重要。
  4. 为Oracle支持收集证据

    • 当需要向Oracle技术支持提交服务请求(SR)时,查询此视图和 V$HANG_INFO 的结果是必须提供的关键诊断信息之一。

3. 字段含义详解

V$HANG_SESSION_INFO 的字段非常详尽,涵盖了会话的各个方面。

字段类别字段名称数据类型含义说明
标识信息SESSION_IDNUMBER会话标识符(SID)
SERIAL#NUMBER会话序列号。与SID共同唯一标识一个会话。
PROCESS_IDNUMBER操作系统进程标识符(PID)
PROCESS_NAMEVARCHAR2(5)进程名称(如:ora, java)。
阻塞链信息CHAIN_IDNUMBER此会话所属的阻塞链的ID。与 V$HANG_INFO.CHAIN_ID 关联。
BLOCKING_SESSIONNUMBER直接阻塞此会话的SID
BLOCKED_SESSIONNUMBER此会话直接阻塞的SID(如果有)。
状态信息STATUSVARCHAR2(8)会话状态(如:ACTIVE, INACTIVE, KILLED)。
STATEVARCHAR2(19)更详细的会话等待状态(如:WAITING, WAITED UNKNOWN TIME, WAITED SHORT TIME)。
WAIT_EVENTVARCHAR2(64)会话当前等待的事件名称(如果是等待状态)。
WAIT_TIMENUMBER已等待的时间(单位:秒)
SECONDS_IN_WAITNUMBER在当前等待事件中已经消耗的秒数
资源信息CURRENT_QUEUESVARCHAR2(128)此会话当前持有的队列锁(Enqueue)列表。格式为 类型-ID1-ID2(如:TX-0001000F-00002A74)。这是诊断锁阻塞的关键!
CURRENT_LATCHESVARCHAR2(128)此会话当前持有的闩锁(Latch)列表
CURRENT_MUTEXESVARCHAR2(128)此会话当前持有的互斥量(Mutex)列表
执行信息SQL_IDVARCHAR2(13)当前正在执行的SQL的ID
SQL_CHILD_NUMBERNUMBERSQL子游标号
SQL_ADDRESSRAW(4 | 8)SQL语句在内存中的地址
SQL_HASH_VALUENUMBERSQL语句的哈希值(较老的方式,与SQL_ID共存)。
PLSQL_ENTRY_OBJECT_IDNUMBER如果正在执行PL/SQL,则是入口对象(如包、过程)的ID
PLSQL_ENTRY_SUBPROGRAM_IDNUMBER入口子程序(如具体的过程、函数)的ID
PLSQL_OBJECT_IDNUMBER当前正在执行的PL/SQL对象的ID
PLSQL_SUBPROGRAM_IDNUMBER当前正在执行的PL/SQL子程序的ID
上下文信息MODULEVARCHAR2(64)应用程序设置的模块名
ACTIONVARCHAR2(64)应用程序设置的动作名
CLIENT_IDENTIFIERVARCHAR2(64)客户端标识符
PROGRAMVARCHAR2(48)客户端程序名(如:sqlplus@hostname (TNS V1-V3))。
PORTNUMBER客户端连接端口
分析信息DETECTION_TIMEDATE此信息被采集的时间点
ORIGINVARCHAR2(64)信息来源(如:ORADEBUG HANGANALYZE)。

4. 相关视图与基表

  • 相关动态性能视图

    • V$HANG_INFO最直接的相关视图。通过 CHAIN_IDSESSION_ID 进行关联。HANG_INFO 展示拓扑,HANG_SESSION_INFO 展示节点详情。
    • V$SESSIONV$HANG_SESSION_INFO 可以看作是挂起分析时的一个 V$SESSION 的超集快照,包含了更多诊断细节。
    • V$LOCKCURRENT_QUEUES 字段的信息可以与 V$LOCK 视图关联,以获取锁的更多属性(如模式、请求时间等)。
    • V$LATCH / V$LATCHHOLDER: 与 CURRENT_LATCHES 字段相关,用于查看闩锁的详细信息。
    • V$SQL: 通过 SQL_ID 关联,获取导致问题或正在被阻塞的SQL语句的完整文本。
    • V$PROCESS: 通过 PROCESS_ID 关联,获取操作系统进程的详细信息。
  • 基表(Underlying Base Table)

    • V$HANG_INFO 类似,V$HANG_SESSION_INFO 没有持久化的基表
    • 它的数据是在执行 ORADEBUG HANGANALYZE 命令时,由数据库诊断进程(DIAG)动态捕获并填充到内存中的
    • 诊断进程会遍历所有会话,不仅记录它们的关系,还会为每个会话拍摄一张详细的“状态快照”。这些快照数据被临时存放在SGA的某个区域,并通过 V$HANG_SESSION_INFO 视图暴露出来。
    • 实例重启或新的 hang analyze 操作会覆盖之前的数据。

5. 底层详细原理

  1. 数据捕获机制

    • ORADEBUG HANGANALYZE 被触发时,数据库会尝试以一种“冻结”系统状态的方式,快速、一致地收集所有会话的详细信息。
    • 这个过程包括:
      • 遍历会话列表: 获取每个会话的核心结构(类似于 V$SESSION 的内容)。
      • 挖掘深层状态: 深入会话结构,提取其当前持有的资源列表(锁、闩锁、互斥量)。这部分信息在常规视图中可能不会直接显示,或者需要关联多个视图才能获得。
      • 记录SQL上下文: 捕获SQL地址、哈希值、PL/SQL堆栈等信息。
      • 打时间戳: 记录采集所有这一切信息的时间点 (DETECTION_TIME)。
  2. 与 Hang Analyze 流程的集成

    • V$HANG_INFOV$HANG_SESSION_INFO 的生成是同一个流程的两个输出。
    • 步骤一:收集数据。DIAG进程收集所有会话的详细信息(用于填充 V$HANG_SESSION_INFO)。
    • 步骤二:分析关系。基于收集到的数据(特别是每个会话的 WAIT_EVENTCURRENT_QUEUES 等信息),分析进程构建阻塞图(用于填充 V$HANG_INFO)。
    • 步骤三:输出结果。将分析结果和详细数据分别写入两个视图和跟踪文件。
  3. 信息的价值

    • CURRENT_QUEUES: 直接告诉你一个会话持有什么锁。如果看到一个会话持有 TX 锁(事务锁)且另一个会话在等待 enq: TX - row lock contention,那么阻塞关系就铁证如山了。
    • CURRENT_LATCHES: 直接指出会话持有了哪个闩锁,这对于诊断内存结构争用(如共享池、库缓存)至关重要。
    • SQL_ADDRESS/SQL_HASH_VALUE: 即使在极端情况下 SQL_ID 无法解析,这些更底层的地址信息也能最终定位到SQL文本。

6. 相关知识点介绍

  • ORADEBUG HANGANALYZE 的级别

    • LEVEL 3: 最常用的级别,收集足够的信息填充 V$HANG_INFOV$HANG_SESSION_INFO
    • LEVEL 4 或更高: 收集更多信息,包括系统状态转储(systemstate dump),数据量巨大,除非Oracle支持人员要求,否则慎用。
  • 系统状态转储(Systemstate Dump)

    • 这是一个比 hang analyze 更重量级的诊断工具。它会将整个Oracle实例的内存状态(包括所有会话、进程、队列、缓冲区等)完整地转储到跟踪文件中。
    • V$HANG_SESSION_INFO 可以看作是系统状态转储中关于会话信息的精华摘要。
  • 诊断的思维模式

    1. 发现症状: 系统慢,会话卡住。
    2. 执行分析ORADEBUG HANGANALYZE 3
    3. 查看拓扑: 查询 V$HANG_INFO,找到阻塞链的根(root blocker)。
    4. 深挖根因: 查询 V$HANG_SESSION_INFO,用 WHERE SESSION_ID = <root_sid> 查看根阻塞者的详细信息。重点看 CURRENT_QUEUES, SQL_ID, WAIT_EVENT
    5. 采取行动: 根据分析结果,决定是kill会话、优化SQL、还是调整资源。

7. 常用查询 SQL

1. 查看阻塞链中所有会话的详细信息(核心查询)
在执行 ORADEBUG HANGANALYZE 3 后运行。

SELECT chain_id,
       session_id,
       serial#,
       blocking_session,
       status,
       state,
       wait_event,
       current_queues, -- 关键字段
       current_latches, -- 关键字段
       sql_id,
       module,
       program
FROM v$hang_session_info
ORDER BY chain_id, session_id;

2. 聚焦于阻塞链的根源(Root Blocker)

SELECT *
FROM v$hang_session_info hsi
WHERE session_id IN (
    SELECT blocking_session
    FROM v$hang_session_info
    WHERE blocking_session IS NOT NULL
    MINUS
    SELECT session_id
    FROM v$hang_session_info
    WHERE blocking_session IS NOT NULL
)
ORDER BY chain_id;
-- 这个查询找到那些阻塞别人但自己不被任何其他会话阻塞的根源会话。

3. 查找持有特定类型锁的会话(例如,TX事务锁)

SELECT chain_id, session_id, serial#, current_queues, sql_id, program
FROM v$hang_session_info
WHERE current_queues LIKE '%TX%' -- 查找持有事务锁的会话
AND current_queues IS NOT NULL;

4. 关联 V$SQL 获取阻塞者正在执行的SQL文本

SELECT hsi.chain_id,
       hsi.session_id,
       hsi.blocking_session,
       hsi.wait_event,
       hsi.current_queues,
       s.sql_text
FROM v$hang_session_info hsi
LEFT JOIN v$sql s ON hsi.sql_id = s.sql_id AND hsi.sql_child_number = s.child_number
WHERE hsi.chain_id = 1 -- 指定阻塞链ID
ORDER BY hsi.session_id;

5. 诊断非锁引起的挂起(查看闩锁和互斥量)

SELECT chain_id,
       session_id,
       current_latches,
       current_mutexes,
       wait_event,
       sql_id
FROM v$hang_session_info
WHERE current_latches IS NOT NULL OR current_mutexes IS NOT NULL;

总结

V$HANG_SESSION_INFO 是Oracle数据库挂起分析体系中的**“显微镜”**。它将 V$HANG_INFO 提供的宏观阻塞图,细化到了每一个参与会话的微观状态。

它的核心价值在于提供了无可辩驳的证据链

  • 锁证据CURRENT_QUEUES 直接显示会话持有的锁,坐实阻塞关系。
  • 资源证据CURRENT_LATCHESCURRENT_MUTEXES 揭示了底层资源争用的元凶。
  • 上下文证据SQL_ID, PLSQL_* 字段精确指出了导致问题的代码。

掌握 V$HANG_INFOV$HANG_SESSION_INFO 的联合使用方法,是DBA解决最棘手的数据库性能僵局(Hang)的最高阶技能。它使DBA能够从“系统好像卡住了”的模糊感知,精准地推进到“是会话A持有的TX锁阻塞了会话B,而会话A正在执行某个UPDATE语句”的精确诊断,从而采取最有效的解决措施。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值