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

最新下载

热门教程

如何解决Oracle ASH数据采样不足的问题

时间:2026-08-16 10:02:49 编辑:袖梨 来源:一聚教程网

ASH数据“不足”需先确认statistics_level为TYPICAL,再排查_ash_size不足、采样时间范围不准或应转向dba_hist_active_sess_history查历史数据。

ASH数据“不足”不是丢了,而是被覆盖或根本没采到——得先分清是内存挤兑、采样失效,还是查询姿势错了。

查不到数据?先确认 statistics_level 是不是 TYPICAL

这是最常被忽略的硬开关。如果设成 ALLBASICv$active_session_history 会彻底停摆,连一行都不会有。

  1. SELECT name, value FROM v$parameter WHERE name = 'statistics_level'; —— 必须返回 TYPICAL
  2. 改回来只需:ALTER SYSTEM SET statistics_level = typical SCOPE = BOTH;,无需重启
  3. RAC 环境下每个节点都得单独检查,别只看一个实例

v$active_session_history 时间跨度太短?大概率是 _ash_size 不够

默认 4MB 内存缓冲区,在高并发下撑不过 10–15 分钟。查 MIN(sample_time)MAX(sample_time) 发现只差几分钟,基本就是 buffer 溢出了。

  1. 扩容需改隐含参数:ALTER SYSTEM SET "_ash_size" = 524288000 SCOPE = SPFILE;(500MB 示例)
  2. 必须同步调大 sga_max_size,否则下次启动失败
  3. 改完要重启实例,不能 SCOPE=BOTH 热生效
  4. 别盲目堆大——超 30MB Oracle 不接受,且过大会挤占其他 SGA 组件

想查“最近一分钟”却总漏数据?别用 SYSDATE - 1/1440

ASH 采样不是均匀滴答,平均约 1 秒一次,但实际间隔浮动很大。用模糊时间范围容易跨过整个采样窗口,直接查不到。

  1. 换成精确时间范围:SAMPLE_TIME BETWEEN TIMESTAMP '2026-07-21 19:30:00' AND TIMESTAMP '2026-07-21 19:31:00'
  2. 若不确定具体秒级时间,先用 dba_hist_active_sess_history 定位大致区间(它每 10 秒存一次,更稳定)
  3. 短于 500ms 的事件本来就会漏采,ASH 就不是为这种粒度设计的

历史问题查不到?转向 dba_hist_active_sess_history 和 AWR 快照

v$active_session_history 是内存视图,天然易失;而 dba_hist_active_sess_history 是磁盘持久化数据,只要 AWR 正常采集,就可能保留数天甚至数周。

  1. 先确认 AWR 快照是否在运行:SELECT COUNT(*) FROM dba_hist_snapshot WHERE end_interval_time > SYSDATE - 1;
  2. 查历史 ASH:SELECT * FROM dba_hist_active_sess_history WHERE sample_time BETWEEN ...
  3. 注意:它只保存约 10% 的原始采样,细节比内存版粗,但时间覆盖长得多
  4. 某些场景(如凌晨抖动),内存版早被覆盖,但 awr_pdb_active_sess_history 里还留着线索

真正难搞的不是调参数,而是区分“没采到”和“采了但被覆盖”。前者得看 statistics_level 和 MMNL 进程是否活着,后者才是调 _ash_size 的事。很多人一上来就加内存,结果发现压根没开采样功能。

热门栏目