Oracle 数据库查看当前正在造成阻塞的 SQL 语句
方法一快速定位阻塞源 (最常用)这是最直接、最高效的方法通过 VSESSION 视图中的 BLOCKING_SESSION 字段可以迅速找到阻塞的根源。1. 找到阻塞者和被阻塞者运行以下 SQL它会列出所有正在阻塞他人的会话及其对应的被阻塞会话。重点关注 BLOCKER 相关的列。SELECTblocker.sid AS blocker_sid,blocker.serial# AS blocker_serial,blocker.username AS blocker_user,blocker.sql_id AS blocker_sql_id,waiter.sid AS waiter_sid,waiter.sql_id AS waiter_sql_idFROM vsession blockerJOIN vsession waiter ON blocker.sid waiter.blocking_sessionWHERE waiter.blocking_session IS NOT NULL;2. 查看阻塞者的 SQL 语句从上一步的结果中获取阻塞者的 SQL_ID (即 blocker_sql_id)然后查询 VSQL 视图来获取完整的 SQL 文本。-- 将 YOUR_BLOCKER_SQL_ID 替换为上一步查到的 SQL_IDSELECT sql_textFROM vsqlWHERE sql_id YOUR_BLOCKER_SQL_ID;提示如果 blocker_sql_id 为空可以尝试查询 VSESSION 中的 PREV_SQL_ID 字段它代表了会话上一次执行的 SQL。 方法二分析复杂阻塞链当一个会话被另一个会话阻塞而后者又被第三个会话阻塞时就形成了阻塞链。此时需要找到链的源头。* 使用递归查询追溯根源以下 SQL 使用 CONNECT BY 语法可以清晰地展示阻塞的层级关系帮助你找到最顶层的“罪魁祸首”。SELECTsid,serial#,username,blocking_session,level AS blocking_level,SYS_CONNECT_BY_PATH(sid, - ) AS blocking_pathFROM vsessionWHERE blocking_session IS NOT NULLCONNECT BY PRIOR sid blocking_sessionSTART WITH sid IN (SELECT blocking_sessionFROM vsessionWHERE blocking_session IS NOT NULL);执行结果中blocking_level 值最小的行通常就是阻塞链的源头。找到其 SID 后再按方法一的步骤2查询其 SQL 即可。 方法三使用高级诊断工具 (适用于严重故障)当系统出现严重的性能问题或大面积会话挂起Hang时可以使用 Oracle 提供的 VHANG_INFO 视图进行深度诊断。1. 触发 Hang 分析首先需要以 SYSDBA 身份执行以下命令来生成分析数据。-- 需要 SYSDBA 权限ORADEBUG hanganalyze 3;2. 查询阻塞信息执行完上一步后立即查询 VHANG_INFO 视图。它的 BLOCKING_TREE 列会以树形结构直观地展示阻塞关系。SELECT blocking_tree, blocked_session, blocking_session, wait_event, sql_idFROM vhang_infoORDER BY blocking_tree;同样找到顶级的阻塞会话及其 SQL_ID然后去 VSQL 视图中查询具体语句。为了方便你理解和记忆以下是排查阻塞问题时最关键的几个动态性能视图视图名称 主要用途VSESSION 核心视图包含所有会话的详细信息BLOCKING_SESSION 字段是定位阻塞的关键。VSQL 通过 SQL_ID 关联用于获取会话正在或最近执行的 SQL 文本。VLOCK 提供更底层的锁信息如锁类型TX, TM、持有模式和请求模式。VHANG_INFO 高级诊断视图在执行 ORADEBUG HANGANALYZE 后使用用于分析复杂的挂起问题。