
Oracle 数据库中的 log file sync 等待事件是前台进程在提交事务(COMMIT)或回滚(ROLLBACK)时,等待 LGWR(日志写入进程)将 redo 日志从内存(log buffer)写入磁盘(redo log file)的过程。该事件直接影响事务响应时间,高等待可能导致数据库整体卡顿甚至挂起。以下从产生过程、触发场景、原因分类、排查方法、优化方案五方面详细解析:
⚙️ 一、等待事件产生过程
当用户发起 COMMIT 或 ROLLBACK 时,需确保 redo 日志持久化到磁盘,流程分六阶段:
- 用户提交:前台进程发出 COMMIT 命令。
- 通知 LGWR:前台进程唤醒 LGWR 写日志。
- LGWR 收集 redo:LGWR 从 log buffer 收集 redo 数据(伴随
log file parallel write等待)。 - 物理写入:LGWR 执行磁盘 I/O(实际写入 redo log file)。
- LGWR 通知前台:写入完成后 LGWR 通知前台进程。
- 前台唤醒:前台进程继续执行。
关键点:log file sync= 阶段 (1) 到 (5) 的总耗时,其中阶段 (4) 对应log file parallel write等待事件。
🔍 二、触发场景
以下操作会触发 log file sync 等待:
- 显式提交/回滚:用户执行
COMMIT或ROLLBACK。 - DDL 操作:执行
CREATE/ALTER/DROP等语句(隐式提交)。 - 数据字典更新:如序列(SEQUENCE)调用
NEXTVAL修改字典。 - 递归事务:某些后台操作(如空间分配)触发的隐式提交。
🛠️ 三、原因分类与典型场景
1. I/O 性能瓶颈(最常见)
- 特征:
log file parallel write等待时间 >5ms(理想值 <1ms)。 - 原因:
- Redo 日志存放在慢速磁盘(如机械盘)或 RAID 5(写惩罚高)。
- 存储带宽不足或与其他文件(数据文件/归档日志)共享磁盘导致争用。
- 关联事件:
db file parallel write(数据文件写入慢可能阻塞 LGWR)。
2. 事务提交过频
- 特征:
user commits统计值高,且 user calls/(user commits + user rollbacks) < 30(表示平均每 30 次操作就有 1 次提交)。 - 影响:频繁提交迫使 LGWR 持续写日志,无法利用 组提交(Group Commit) 优化(本可合并多个提交一次性写入)。
3. 日志配置不当
- 日志文件过小:频繁日志切换(每小时 >4 次),导致 LGWR 忙于切换而非写入。
- 日志组不足:LGWR 需等待归档完成才能重用日志文件(尤其在 ARCHIVELOG 模式)。
4. CPU 资源竞争
- 特征:
log file sync等待高但log file parallel write正常(如 <1ms)。 - 原因:LGWR 或 LMS(RAC 环境中)进程无法及时获取 CPU 调度,常见于系统负载过高或进程优先级配置不当。
5. Oracle 内部机制问题
- 自适应日志同步(Adaptive Log File Sync):
11.2.0.3+ 默认启用参数_use_adaptive_log_file_sync,使 LGWR 在 Post/Wait(实时通知)和 Polling(轮询)模式间切换。Bug 可能导致前台进程无法及时获知写入完成,引发高等待。 - RAC 环境特有原因:
- SCN 同步延迟:LMS 进程传播提交 SCN 到其他节点变慢(私有网络或 CPU 瓶颈)。
- DRM(Dynamic Remastering):频繁重配置资源主节点,增加 Commit 时协调开销。
6. 其他原因
- Log Buffer 过大:过大的
LOG_BUFFER导致单次写入量增多,延长 I/O 时间。 - Oracle Bug:如 19.5 版本中 LMS 进程的
log write broadcast延迟(19.8+ 修复)。
🔎 四、排查流程与工具
1. 确认等待事件影响
- AWR 报告:
查看 Top Timed Foreground Events 部分,关注:Event Waits Avg Wait (ms) % DB Time log file sync 10,000 356 82% -- 平均等待 >20ms 为严重问题 - 关联事件分析:
若log file parallel write等待高 → I/O 瓶颈;若低但log file sync高 → CPU 或自适应机制问题。
2. 分析 I/O 性能
- 检查存储延迟:
SELECT event, average_wait FROM v$system_event WHERE event IN ('log file parallel write', 'db file parallel write'); -- 目标:log file parallel write < 5ms - 日志文件位置:
确认 redo 日志未存放在 RAID 5 或慢速盘(通过v$logfile查看路径)。
3. 评估提交频率与日志配置
- 提交频率:
SELECT (user_calls / (user_commits + user_rollbacks)) AS commits_per_call FROM v$sysstat; -- 若 < 30 则提交过频 - 日志切换频率:
SELECT thread#, sequence#, first_time FROM v$log_history WHERE first_time > SYSDATE-1/24; -- 检查 1 小时内切换次数 -- 合理值:每小时 ≤4 次
4. 检查自适应同步与 RAC 问题
- 自适应模式状态:
SELECT value FROM v$parameter WHERE name = '_use_adaptive_log_file_sync'; -- 若为 TRUE 且等待异常,建议关闭 - RAC 环境专项检查:
- LMS 进程延迟:
SELECT * FROM v$system_event WHERE event = 'log file sync' AND wait_class = 'Commit'; - DRM 影响:
查看 AWR 中 Dynamic Remastering Stats 的replayed locks sent值(高值需关闭 DRM)。
- LMS 进程延迟:
5. 操作系统与进程跟踪
- LGWR 跟踪文件:
在diag路径下检查lgwr_<sid>.trc,搜索 warning 或 error。 - CPU 调度延迟:
使用top或pidstat监控 LGWR/LMS 进程的 CPU 使用率和等待状态。
🚀 五、优化方案
1. 存储层优化
- 分离 redo 日志:使用 SSD 或高速 SAN,独立于数据文件存放。
- 禁用 RAID 5:改用 RAID 10 或裸设备(避免写放大)。
2. 事务与配置调整
- 批量提交:改造应用逻辑,合并多次提交(如每 1000 行提交 1 次)。
- 日志文件扩容:增大 redo log 至 1GB+/组,确保 15–20 分钟切换 1 次。
- 关闭自适应同步(必要时):
ALTER SYSTEM SET "_use_adaptive_log_file_sync" = FALSE; -- 11.2.0.3+ 生效
3. RAC 环境专项优化
- 关闭 DRM:
ALTER SYSTEM SET "_gc_policy_time" = 0; - 增加 LMS 进程:
ALTER SYSTEM SET parallel_adaptive_multi_user = FALSE; -- 减少协调开销
4. 参数与补丁管理
- 调整 Log Buffer:避免过大(通常 64MB–256MB 足够)。
- 应用补丁:如 19c 环境中安装 Patch 解决 LMS 广播延迟(Bug 29890397)。
5. 高级方案(风险评估后使用)
- 异步提交(
COMMIT WRITE BATCH NOWAIT):
牺牲部分持久性换取性能(提交后不等待刷盘)。 - NOLOGGING 操作:对批量加载数据使用
/*+ APPEND */减少 redo 生成。
💎 六、总结
log file sync 的根因本质是 LGWR 写入效率与事务提交频率不匹配。优化核心路径:
- I/O 优化:确保 redo 日志写入低延迟(SSD + 独立路径)。
- 事务合并:减少提交次数,利用组提交机制。
- 参数调优:关闭自适应同步、调整日志大小、修复已知 Bug。
- RAC 专项:协调 SCN 传播效率,关闭 DRM。
监控标准:
log file sync平均等待 <5ms 为优,>20ms 需紧急处理。 定期检查 AWR 的 Top 等待事件与v$sysstat的提交比例,可提前预防性能恶化。
欢迎关注我的公众号《IT小Chen》
361

被折叠的 条评论
为什么被折叠?



