记一次生产数据库log file sync 等待事件异常及处理过程

网友投稿 1229 2023-05-12

记一次生产数据库log file sync 等待事件异常及处理过程

记一次生产数据库log file sync 等待事件异常及处理过程

今天主要从一个案例来介绍一下log file sync这个等待事件及常用的一些解决办法,下面先看下故障时间段的等待事件。

1. 查看卡顿时间段的等待事件及会话

查看故障时间段等待事件、问题sql id及会话访问次数

select trunc(sample_time, 'mi') tm, sql_id, nvl(event,'CPU'),count(distinct session_id) cnt  from dba_hist_active_sess_history  where sample_time between to_date('2019-09-03 9:30:00') and  to_date('2019-09-03 11:00:00')  group by trunc(sample_time, 'mi'), sql_id,nvl(event,'CPU')  order by cnt desc;

查看该sql相关的等待事件及对应的会话访问次数

select sql_id, nvl(event, 'CPU'), count(distinct session_id) sz  from dba_hist_active_sess_history a, dba_hist_snapshot b  where sample_time between to_date('2019-09-03 09:30:00') and  to_date('2019-09-03 11:00:00')  and sql_id = '0spj1q9t1yh2d'  and a.snap_id = b.snap_id  and a.instance_number = b.instance_number  group by sql_id, nvl(event, 'CPU')  order by sz desc;

很明显看到都是log file sync等待事件很明显。那什么是log file sync呢?

2. log file sync -- 日志文件同步

可以通过如下公式计算平均 Redo 写大小:

avg.redo write size = (Redo block written/redo writes)*512 bytes

如果系统产生 Redo 很多,而每次写的较少,一般说明 LGWR 被过于频繁地激活了。 可能导致过多的 Redo 相关 Latch 的竞争, 而且 *** 可能无法有效地使用 piggyback 的功能。从一个AWR报告中提取一些数据来研究一下这个问题。

log file sync等待事件的优化方案:

优化了redo日志的I/O性能,尽量使用快速磁盘,不要把redo log file存放在raid 5的磁盘上;加大日志缓冲区(log buffer);使用批量提交,减少提交的次数;部分经常提交的事务设置为异步提交;适当使用NOLOGGING/UNRECOVERABLE等选项;采用专用网络,正确设置网络UDP buffer参数;安装最新版本数据库避免bug

3. awr报告--rman备份

收集一下awr报告来分析,收集过程这里就不做介绍了。

(1) 报告如下:

这里可以注意到有一个异常的等待事件--RMAN backup & recovery I/O,应该是rman刚好在做备份导致的磁盘IO繁忙

(2) 观察RMAN日志

很明显是从凌晨5点开始备份,一直备份到接近10点导致,这里也消耗了一部分的磁盘IO

(3) 调整备份时间

下面回到log file sync的分析上。

4. awr报告--log file sync

注意以上输出信息,这里 log file sync 和 db file parallel write 等等待事件同时出现,那么可能的一个原因是 I/O 竞争导致了性能问题, 实际用户环境正是日志文件和数据文件同时存放在 RAID5 的磁盘上,存在性能问题需要调整。

(RAID 5不对数据进行备份,而是把数据和与其相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。)

5. 计算平均日志写大小:

avg.redo write size = (Redo block written/redo writes)*512 bytes= ( 3,596,472/ 150,976 )*512 =12196 bytes =11KB

这个平均值有点小了,说明系统的提交过于频繁。

从以上的统计信息中, 可以看到平均每秒数据库的提交数量是18.62 次。 如果可能, 在设计应用时应该选择合适的提交批量,从而提高数据库的效率。

6. ***11g新特性(Adaptive Log File Sync - 自适应的Log File Sync)

关于 Log File Sync 等待的优化,在***数据库中一直是常见问题,LOG FILE的写出性能一旦出现波动,该等待就可能十分突出。

在以前版本中,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 的等待异常的高,在遇到问题时,通常将 _use_adaptive_log_file_sync 参数设置为 False,回归以前的模式,将会有助于问题的解决。

这里我的数据库版本是11.2.0.1,检查发现也有这种情况,所以做了一些参数上的调整:

SQL> show parameter parallel_adaptive_multi_user; SQL> alter system set parallel_adaptive_multi_user=false scope=both;

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自定义构建交互式SSH应用程序,以Python为例
下一篇:记一次生产数据库sql优化案例--23秒优化到0.9秒
相关文章