最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle数据库为何ASH报告缺少关键会话
时间:2026-08-28 09:32:49 编辑:袖梨 来源:一聚教程网
ASH报告缺少关键会话大概率因视图选择、时间窗口或采样条件错误:v$active_session_history为1小时内存环形缓冲区,dba_hist_active_sess_history仅存1/10样本且依赖AWR快照;查空需先验证_ash_enable=TRUE、MMNL进程正常、ASH buffers充足,并用精确时间范围和快照存在性检查定位。
ASH报告缺少关键会话,大概率不是数据丢了,而是你查的视图、时间窗口或采样条件没对上——v$active_session_history 本身是内存滚动缓冲区,1小时内数据随时可能被覆盖,而 dba_hist_active_sess_history 又只存1/10的样本且依赖AWR快照节奏。
查 v$active_session_history 返回空?先确认 ASH 是否真在运行
很多升级到19c后突然查不到ASH数据的案例,根源是隐含参数被重置或后台进程异常:
-
_ash_enable = FALSE是最常见原因,尤其在ADG备库或升级后未显式启用;执行SELECT value FROM v$parameter WHERE name = '_ash_enable'验证,若为FALSE,需重启实例前加ALTER SYSTEM SET "_ash_enable"=TRUE SCOPE=SPFILE -
MMNL进程挂了:查SELECT program, status FROM v$process WHERE program LIKE '%MMNL%',缺失或状态非ACTIVE就得排查实例告警日志 - 缓冲区被撑爆但没报错:
v$sgastat中ASH buffers分配不足(比如11g默认4MB,高并发下实际需30MB+),可临时调大_ash_size,但必须重启
明明发生过阻塞,dba_hist_active_sess_history 却查不到?时间锚点错了
历史表不是“全量录像”,它是每10秒从内存采一次样,且只保留最近1小时(默认)——你看到的“空”,往往是时间窗口和采样节奏没咬合:
- 别用模糊时间:
SAMPLE_TIME > SYSDATE - 1/24(一小时)容易跨过采样点;改用精确范围,比如死锁发生在14:22:37,就查SAMPLE_TIME BETWEEN TIMESTAMP '2026-07-28 14:22:30' AND TIMESTAMP '2026-07-28 14:22:45' - 必须验证AWR快照存在:执行
SELECT MIN(snap_id), MAX(snap_id) FROM dba_hist_snapshot WHERE end_interval_time > SYSDATE - 1/24,若无结果,说明那段历史根本没入库 -
blocking_session在历史表里大量为空:19c以前版本该字段不稳定,优先用final_blocking_session(12c+)替代,但仅限v$active_session_history,历史表不带这个字段
ASH报告里看不到 enq: TX - row lock contention?等待事件被过滤掉了
ASH默认只采非空闲会话,但某些短时等待(如持锁300ms)可能因采样偏差漏掉,或被误判为其他事件:
- 别只筛
event LIKE 'enq: TX%':enq: TX - allocate ITL entry和enq: TX - row lock contention完全不同,后者才是真行锁;前者是ITL不足,查p3值区分——行锁争用的p3通常是0x0或小整数,ITL的是0x2000000+ - 真实等待可能藏在
session_state = 'WAITING'+wait_class = 'Concurrency'组合里,单独查event容易漏;例如library cache lock有时伪装成TX类等待 - SQL_ID为空的等待(如
SQL*Net message from client)不会进ASH主分析流,但它占满连接池时,会把真正干活的会话挤出采样窗口——先查这类长等待,再看是否影响了核心事务采样率
最常被忽略的点:ASH不是“所有会话的完整日志”,它是个带偏差的统计抽样。你找不到某个会话,未必是它没活动,更可能是它等得太短、太散,或者刚好卡在两次采样中间。诊断时永远先锁定时间、事件、状态三要素,再决定查内存视图还是历史表,而不是反过来。