AWR可精准定位日志切换频繁根因:先查Top 5 Timed Events判断等待类型,再结合Redo Statistics反推日志大小合理性,通过SQL by Physical Reads定位高redo语句,最后用v$log_history验证时间分布并排查时区偏差。
日志切换太频繁,不是靠调大日志文件就能解决的——awr 能直接告诉你“谁在猛写 redo”,但前提是你会翻对页、看对指标、避开时区陷阱。
查 Top 5 Timed Events 确认是不是真卡在日志切换上
打开 AWR 报告后,直奔 Top 5 Timed Events 页面。重点盯住这两个等待:
-
log file switch (checkpoint incomplete)占比高 → 检查点没跑完,旧日志组还不能重用,常见于DB_BLOCK_BUFFERS过大、I/O 慢、或LOG_BUFFER太小 -
log file switch (archiving needed)占比高 → 归档进程跟不上,比如归档路径满、ARCHIVE_LAG_TARGET设了非零值(如 1800)、或备库同步拖慢主库 - 如果两者都低,但
log file sync高 → 问题不在日志配置,而在应用层:高频短事务、频繁COMMIT,得查v$session中event为该等待的sid和sql_id
用 Redo size/s + log switches 反推日志组是否够用
去 AWR 报告的 Redo Statistics 区域找两个关键数:
-
Redo size per second:比如是 2.3 MB/s -
log switches:比如一小时切了 180 次 → 平均 20 秒一次
拿日志大小除一下:若当前 V$LOG.BYTES 是 100MB,则理论撑约 43 秒(100 ÷ 2.3),和实测 20 秒差距大,说明不是单纯“写得多”,而是有突发峰值(比如批量 UPDATE 或 LOB 修改);此时光加日志大小治标不治本,得往下挖 SQL。
从 SQL ordered by Physical Reads 定位高日志生成语句
物理读高的 SQL,往往 redo 也高——尤其带索引更新、未绑定变量的重复 DML、或 UPDATE 后触发大量二级索引维护。去 AWR 报告中 SQL Statistics → SQL ordered by Physical Reads 页,重点关注:
- 执行次数(
Executions)高 + 物理读(Physical Reads)也高的语句 - 执行计划里含
INDEX RANGE SCAN后接大量TABLE ACCESS BY INDEX ROWID+UPDATE - 对应
sql_id在v$sql中的buffer_gets和disk_reads是否持续偏高
曾有案例:一条 DELETE FROM wri$_adv_objects 在错误时区下白天高频执行,就是靠这页揪出来的。
别跳过 v$log_history 的时间分布验证
AWR 报告只给聚合结果,但日志切换可能是周期性爆发的(比如每天 13:00 固定飙升)。必须补一手原始数据:
SELECT TO_CHAR(FIRST_TIME, 'hh24:mi'), COUNT(*) FROM v$log_history WHERE FIRST_TIME > SYSDATE - 1/24 GROUP BY TO_CHAR(FIRST_TIME, 'hh24:mi') ORDER BY COUNT(*) DESC;
如果发现 13:00–13:05 集中切了 40+ 次,而其他时段平稳,基本可锁定是调度任务异常——这时要立刻查 DBTIMEZONE 和 SESSIONTIMEZONE,很多问题就出在数据库时区仍是 PST8PDT,但窗口任务却按 +08:00 设置,实际执行时间平移了 15 小时。


















