AWR报告默认不显示DBW0/LGWR等后台进程的SQL执行轨迹,因ASH硬编码过滤BACKGROUND会话,仅采集前台活动;后台负载需通过V$SYS_TIME_MODEL、V$SYSTEM_EVENT及DBA_HIST_SYSTEM_EVENT等视图分析等待事件和系统统计。
awr 报告默认不显示所有后台进程活动,这不是 bug,而是 oracle 11g 的设计限制:mmon 只采集前台会话(v$session 中 type = 'user')的完整执行上下文,而后台进程(如 dbw0、lgwr、ckpt)的活动仅以聚合指标形式出现在等待事件、系统统计中,不会单独展开为“sql 执行轨迹”或“活跃会话堆栈”。
Oracle 11g 的 V$ACTIVE_SESSION_HISTORY 默认过滤掉后台进程(SESSION_TYPE = 'BACKGROUND'),这是硬编码行为,与 STATISTICS_LEVEL 设置无关。即使设为 ALL,ASH 仍只捕获前台会话的每秒采样;后台进程的内部调度、I/O 提交、检查点推进等动作不进入 ASH 队列。
SELECT COUNT(*) FROM v$active_session_history WHERE session_type = 'BACKGROUND'; —— 在 11.2.0.3 及之前版本中几乎总是返回 0DBW0 刷脏块、LGWR 写日志的 CPU/IO 消耗,容易误判“CPU 空闲”而忽略后台瓶颈V$SYS_TIME_MODEL 和 V$SYSTEM_EVENT 中的 background elapsed time、log file sync、db file parallel write 等事件才是后台负载的真实入口设为 ALL 只影响前台 SQL 的文本捕获(填满 DBA_HIST_SQLTEXT),对后台进程无效——因为后台进程本身不执行用户 SQL,它们运行的是内核级 C 代码逻辑,没有 SQL_ID 或可解析语句。
DBA_HIST_SQLSTAT 表里所有行都对应 sql_id IS NOT NULL,而后台进程活动无此字段,自然不会被关联进 SQL 统计报表DBA_HIST_SYSTEM_EVENT 中后台相关事件的等待时间占比,以及 DBA_HIST_OSSTAT 中 PHYSICAL_WRITE_BYTES_TOTAL 等 I/O 总量指标当 AWR 报告显示 “DB Time log file sync 或 db file parallel write 占比异常高时,大概率是后台进程饱和,但报告不会告诉你哪个后台进程卡在哪儿。
SELECT event, p1text, p1, p2text, p2, p3text, p3 FROM v$session_wait WHERE sid IN (SELECT sid FROM v$session WHERE type = 'BACKGROUND') AND state = 'WAITING';
DBA_HIST_SYSTEM_EVENT,用 event LIKE 'log file%' 或 event LIKE 'db file%' 过滤,观察等待时间随时间的变化曲线DBA_HIST_WAITSTAT 中的 class = 'log buffer' 或 'buffer cache' 高值,往往比单个等待事件更能暴露后台资源争用本质真正难排查的,从来不是前台 SQL 跑得慢,而是后台进程在默默吞掉所有 I/O 带宽或日志写入能力——AWR 报告给你的是一张“前台视角地图”,而底层真实压力可能全在后台进程的无声运转中。盯着 Top SQL 往往找不到根因,必须切到系统级等待和 OS 层面的 I/O 吞吐验证。