是,日志切换卡顿需按四步排查:先看Top 5 Timed Events中log file switch两类事件占比是否超10%;再算Redo size/s与日志大小反推切换频率是否合理;接着查SQL ordered by Physical Reads定位高redo语句;最后用v$log_history验证切换是否周期性爆发。
查 Top 5 Timed Events 里是不是真卡在日志切换上
直接翻到 awr 报告的 top 5 timed events 页面,盯住这两个等待事件:log file switch (checkpoint incomplete) 和 log file switch (archiving needed)。如果任一占比超过 10% 的 db time,基本可以断定卡点就在日志重用环节。
前者高 → 检查点没跑完,旧日志组还被占着,常见于 DB_BLOCK_BUFFERS 过大、I/O 慢、或 LOG_BUFFER 太小;
后者高 → 归档进程跟不上,比如归档路径满、ARCHIVE_LAG_TARGET 设了非零值(如 1800)、或备库同步拖慢主库;
如果这两个都低,但 log file sync 高 → 问题不在日志配置,而在应用层:高频短事务、频繁 COMMIT,得去 v$session 查 event = 'log file sync' 的 sid 和 sql_id。
用 Redo size/s 和 log switches 反推日志组是否撑得住
去 AWR 报告的 Redo Statistics 区域找两个数:Redo size per second 和一小时内的 log switches 次数。比如 Redo size per second 是 2.3 MB/s,当前 v$log.bytes 是 100MB,理论可撑约 43 秒(100 ÷ 2.3);若实测平均 20 秒切一次,说明不是单纯“写得多”,而是有突发峰值(如批量 UPDATE 或 LOB 修改)。
这时候光加日志大小治标不治本,得往下挖 SQL;
如果 Redo size per second 是 1.09 MB/s,而日志组总容量才 600MB(3 组 × 200MB),那撑不到 10 分钟就会切,属于明显偏小;
注意:单个大事务可能瞬间打爆一个日志组,只看吞吐不看峰值会误判。
从 SQL ordered by Physical Reads 定位高 redo 语句
去 AWR 报告的 SQL Statistics → SQL ordered by Physical Reads 页面,找那些 Physical Reads 高且 Executions 也高的语句。物理读多的 SQL,往往 redo 也高——尤其带索引更新、未绑定变量的重复 DML、或 UPDATE 后触发大量二级索引维护。
重点看执行计划里有没有 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 固定飙升)。必须运行原始 SQL 验证:
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 1;
如果每 10–15 分钟就切一次,且业务量无突增,大概率是 ARCHIVE_LAG_TARGET 设置过小;
别忽略时区偏差——FIRST_TIME 是数据库时区,不是操作系统时区,错配会导致分析时段偏移;
如果发现凌晨 2 点集中切换,但业务完全静默,就要怀疑是否有定时任务或自动维护作业在触发隐式 DML。



















