必须使用GV$ACTIVE_SESSION_HISTORY,因其含INST_ID字段可跨RAC节点定位阻塞源;需同时过滤blocking_session IS NOT NULL且blocking_instance IS NOT NULL;时间条件应为SAMPLE_TIME > SYSDATE - INTERVAL '5' MINUTE;查到final_blocking_session后须切至对应节点的gv$session确认会话状态。

必须用 GV$ACTIVE_SESSION_HISTORY,不是 V$ACTIVE_SESSION_HISTORY
单查 V$ACTIVE_SESSION_HISTORY 只能看到本节点的会话样本,RAC 中阻塞源在其他节点时,blocking_session 字段可能指向一个你根本查不到的 SID。比如查到 blocking_session = 1234、blocking_instance = 2,但你在节点 1 的 V$ 视图里永远找不到这个会话。只有 GV$ACTIVE_SESSION_HISTORY 才带 INST_ID 字段,能跨实例对齐采样时间与阻塞关系。
查阻塞链必须显式过滤 blocking_instance IS NOT NULL
很多用户只加 blocking_session IS NOT NULL,结果漏掉 RAC 跨节点阻塞。因为当阻塞源在远程节点时,blocking_session 值存在,但 blocking_instance 才告诉你它在哪。不加这个条件,GV$ 返回的是全集群所有会话的“扁平快照”,无法区分本地等待 vs 远程持锁。
- 正确写法:
WHERE event = 'library cache lock' AND wait_time = 0 AND blocking_session IS NOT NULL AND blocking_instance IS NOT NULL - 错误写法:只写
blocking_session IS NOT NULL,或用blocking_instance = 1硬编码指定某节点 -
blocking_instance是数字(如 1、2),不是字符串,别加单引号
时间窗口必须用动态表达式,别写死时间
ASH 内存只保留约 1 小时,且高负载下更短;写死时间字符串(如 '2026-10-26 14:00:00')极易因 NLS 设置或时区偏差返回空。真正有效的窗口是相对当前时间的滑动区间。
- 推荐:
SAMPLE_TIME > SYSDATE - INTERVAL '5' MINUTE - 避免:
SAMPLE_TIME BETWEEN ... AND ...—— 边界采样点可能刚好错过关键样本 - RAC 下不同节点系统时间可能有毫秒级偏差,用
SYSDATE比用固定时间戳更可靠
定位到 final_blocking_session 后,必须切到对应节点确认
GV$ACTIVE_SESSION_HISTORY 只告诉你“当时谁在阻塞”,不保证该会话现在还活着。比如查到 final_blocking_instance = 2、final_blocking_session = 8912,下一步必须立刻连上节点 2,执行:
SELECT sid, serial#, username, sql_id, sql_opname, event, state FROM gv$session WHERE inst_id = 2 AND sid = 8912;
重点看 state 是 ACTIVE 还是 INACTIVE,以及 sql_id 是否为空——DDL 类操作(如 CREATE OR REPLACE PACKAGE)常无 sql_id,得靠 sql_opname 和 sql_text 定位。


















