log file sync( 日志文件同步)
当一个用户提交或回滚数据时, LGWR 将会话期的重做由 Log Buffer 写入到重做日志中,LGWR 完成任务以后会通知用户进程。 日志文件同步等待( Log File Sync) 就是指进程等待LGWR 写完成这个过程, 对于回滚操作,该事件记录从用户发出 rollback 命令到回滚完成的时间。
如果该等待过多,可能说明 LGWR 的写出效率低下,或者系统提交过于频繁。 针对该问题,可以关注 log file parallel write 等待事件,或者通过 user commits,user rollback 等统计信息观察提交或回滚次数。
可能的解决方案主要有:
(1)提高 LGWR 性能, 尽量使用快速磁盘,不要把 redo log file 存放在 RAID5 的磁盘上;
(2)使用批量提交;
(3)适当使用 NOLOGGING/UNRECOVERABLE 等选项。
可以通过如下公式计算平均 Redo 写大小:
avg.redo write size = (Redo block written/redo writes)*512 bytes
如果系统产生 Redo 很多,而每次写的较少,一般说明 LGWR 被过于频繁地激活了。 可能导致过多的 Redo 相关 Latch 的竞争, 而且 Oracle 可能无法有效地使用 piggyback 的功能。从一个 Statspack 报告中提取一些数据来研究一下这个问题。
Report 概要信息如下
注意以上输出信息,这里 log file sync 和 db file parallel write 等等待事件同时出现,那么可能的一个原因是 I/O 竞争导致了性能问题, 实际用户环境正是日志文件和数据文件同时存放在 RAID5 的磁盘上,存在性能问题需要调整。
(RAID 5不对数据进行备份,而是把数据和与其相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。)
统计信息如下:
-------------------------------------------------------------
根据统计信息可以计算平均日志写大小:
avg.redo write size = (Redo block written/redo writes)*512 bytes
= ( 93,853 / 14,572 )*512
= 3KB
这个平均值过小了,说明系统的提交过于频繁。从以上的统计信息中, 可以看到平均每秒数据库的提交数量是 9.6 次。 如果可能, 在设计应用时应该选择合适的提交批量,从而提高数据库的效率。
由于过度频繁的提交, LGWR 过度频繁的激活,看到这里出现了 redo writing 的 latch 竞争。以下是一则 ASH 报告中显示的 Log File Sync 等待信息,注意到其 Parameter 1 是 Buffer#,Parameter 2 代表 Sync SCN,也就是同步的 SCN。 Log File Sync 以 SCN 为节点,以 Buffer 号为起始,不断将 Log Buffer 的内容写出到日志文件上来:
Oracle 11g 中新特性
Adaptive Log File Sync - 自适应的Log File Sync
关于 Log File Sync 等待的优化,在Oracle数据库中一直是常见问题,LOG FILE的写出性能一旦出现波动,该等待就可能十分突出。
在Oracle 11.2.0.3 版本中,Oracle 将隐含参数 _use_adaptive_log_file_sync 的初始值设置为 TRUE,由此带来了很多 Log File Sync 等待异常的情况,这个问题虽然由来已久,但是仍然有很多Oracle的用户并不知情。
当前台进程提交事务(commit)后,LGWR需要执行日志写出操作,而前台进程因此进入 Log File Sync 等待周期。
在以前版本中,LGWR 执行写入操作完成后,会通知前台进程,这也就是 Post/Wait 模式;在11gR2 中,为了优化这个过程,前台进程通知LGWR写之后,可以通过定时获取的方式来查询写出进度,这被称为 Poll 的模式,在11.2.0.3中,这个特性被默认开启。这个参数的含义是:数据库可以在自适应的在 post/wait 和 polling 模式间选择和切换。
_use_adaptive_log_file_sync 参数的解释就是: Adaptively switch between post/wait and polling ,正是由于这个原因,带来了很多Bug,反而使得 Log File Sync 的等待异常的高,如果你在 11.2.0.3 版本中观察到这样的表征,那就极有可能与此有关。
在遇到问题是,通常将 _use_adaptive_log_file_sync 参数设置为 False,回归以前的模式,将会有助于问题的解决。
关闭:
SQL> alter system set parallel_adaptive_multi_user=false scope=both;
System altered.
SQL> show parameter adaptive;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
parallel_adaptive_multi_user boolean
FALSE