V$ACTIVE_SESSION_HISTORY是唯一能捕获死锁发生前真实阻塞链的视图,因其每秒采样、内存实时、可精准定位“黄金5分钟”内互指会话;而DBA_HIST_ACTIVE_SESS_HISTORY采样滞后(10秒/次)、字段不稳定、入库延迟,无法捕捉亚秒级死锁。

V$ACTIVE_SESSION_HISTORY 是唯一能抓到死锁发生前真实阻塞链的视图,DBA_HIST_ACTIVE_SESS_HISTORY 查不到刚发生的死锁——它采样滞后、字段不稳定、入库有延迟。
为什么必须用 V$ACTIVE_SESSION_HISTORY 而不是历史表
死锁通常在 1 秒内被 Oracle 自动检测并回滚牺牲者(victim),而 DBA_HIST_ACTIVE_SESS_HISTORY 默认每 10 秒批量刷入一次数据,且保留时间常为 1 小时。这意味着:
- 死锁发生在
14:22:37,但最近入库的采样点是14:22:30和14:22:40,关键秒直接丢失 -
blocking_session字段在 19c 以前版本中大量为空或为 0,互指关系断裂 - 牺牲者回滚后,后续采样中
blocking_session被清空,历史表只剩“单边等待”快照
V$ACTIVE_SESSION_HISTORY 查询要带两个硬条件
查之前不加过滤,结果集太大且噪声多;只查 enq: TX% 又容易漏掉非行锁类死锁(如 ITL 不足)。正确做法是聚焦“黄金 5 分钟”+“双向互指”:
- 时间范围必须是
SAMPLE_TIME > SYSDATE - 5/1440(即最近 5 分钟),不能靠猜或等 AWR 报告 - 必须同时捕获
blocking_session IS NOT NULL的会话,以及这些会话本身又被谁阻塞(子查询嵌套) -
event必须区分enq: TX - row lock contention(真死锁)和enq: TX - allocate ITL entry(ITL 不足,非死锁)
典型查询:
SELECT sample_time, session_id, blocking_session, blocking_session_serial#, event, sql_id, current_obj#
FROM v$active_session_history
WHERE sample_time > SYSDATE - 5/1440
AND event LIKE 'enq: TX%'
AND (blocking_session IS NOT NULL
OR session_id IN (
SELECT blocking_session
FROM v$active_session_history
WHERE sample_time > SYSDATE - 5/1440
AND blocking_session IS NOT NULL
))
ORDER BY sample_time DESC;
怎么确认是死锁链而不是普通阻塞
看结果里是否存在同一秒(sample_time 精确到秒)下两个会话 A 和 B 互相出现在对方的 blocking_session 字段中——这就是死锁环的实锤证据。
- 比如 A 的
blocking_session = 123,B 的blocking_session = 456,而 B 的session_id = 123、A 的session_id = 456 - 注意:单次采样可能只捕到其中一环,所以要按
sample_time排序,人工比对连续几行 - 记下这对会话的
session_id和精确sample_time,这是后续查DBA_HIST_ACTIVE_SESS_HISTORY或dba_deadlocks的唯一可靠锚点
别跳过 @hang.sql 和 hanganalyze 的现场快照
V$ACTIVE_SESSION_HISTORY 只能帮你定位“谁卡了谁”,但无法还原锁资源类型、SQL 执行上下文、事务状态。这时候要立刻补一手:
- 运行
@hang.sql:输出包含 SID、锁类型(TX、TM)、mode_held/mode_requested、等待事件链,适合快速判断是否已升级为 hang - 执行
oradebug setmypid; oradebug unlimit; oradebug hanganalyze 3:生成 systemstate dump,能看清进程级等待依赖和 latch 持有情况 - 这两个动作必须在发现疑似死锁后 2 分钟内完成,否则内存状态可能已被覆盖
ASH 给你时间锚点和会话对,@hang.sql 和 hanganalyze 给你锁粒度和执行现场——缺一不可。最常被忽略的是:没在第一时间跑 @hang.sql,等去翻 DBA_HIST_ACTIVE_SESS_HISTORY 时,连阻塞链都只剩残影了。











