一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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数据的案例,根源是隐含参数被重置或后台进程异常:

  1. _ash_enable = FALSE 是最常见原因,尤其在ADG备库或升级后未显式启用;执行 SELECT value FROM v$parameter WHERE name = '_ash_enable' 验证,若为 FALSE,需重启实例前加 ALTER SYSTEM SET "_ash_enable"=TRUE SCOPE=SPFILE
  2. MMNL 进程挂了:查 SELECT program, status FROM v$process WHERE program LIKE '%MMNL%',缺失或状态非 ACTIVE 就得排查实例告警日志
  3. 缓冲区被撑爆但没报错:v$sgastatASH buffers 分配不足(比如11g默认4MB,高并发下实际需30MB+),可临时调大 _ash_size,但必须重启

明明发生过阻塞,dba_hist_active_sess_history 却查不到?时间锚点错了

历史表不是“全量录像”,它是每10秒从内存采一次样,且只保留最近1小时(默认)——你看到的“空”,往往是时间窗口和采样节奏没咬合:

  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'
  2. 必须验证AWR快照存在:执行 SELECT MIN(snap_id), MAX(snap_id) FROM dba_hist_snapshot WHERE end_interval_time > SYSDATE - 1/24,若无结果,说明那段历史根本没入库
  3. blocking_session 在历史表里大量为空:19c以前版本该字段不稳定,优先用 final_blocking_session(12c+)替代,但仅限 v$active_session_history,历史表不带这个字段

ASH报告里看不到 enq: TX - row lock contention?等待事件被过滤掉了

ASH默认只采非空闲会话,但某些短时等待(如持锁300ms)可能因采样偏差漏掉,或被误判为其他事件:

  1. 别只筛 event LIKE 'enq: TX%'enq: TX - allocate ITL entryenq: TX - row lock contention 完全不同,后者才是真行锁;前者是ITL不足,查 p3 值区分——行锁争用的 p3 通常是 0x0 或小整数,ITL的是 0x2000000+
  2. 真实等待可能藏在 session_state = 'WAITING' + wait_class = 'Concurrency' 组合里,单独查 event 容易漏;例如 library cache lock 有时伪装成TX类等待
  3. SQL_ID为空的等待(如 SQL*Net message from client)不会进ASH主分析流,但它占满连接池时,会把真正干活的会话挤出采样窗口——先查这类长等待,再看是否影响了核心事务采样率

最常被忽略的点:ASH不是“所有会话的完整日志”,它是个带偏差的统计抽样。你找不到某个会话,未必是它没活动,更可能是它等得太短、太散,或者刚好卡在两次采样中间。诊断时永远先锁定时间、事件、状态三要素,再决定查内存视图还是历史表,而不是反过来。

热门栏目