关于log file sync的解惑

最近我收到一封邮件,有个同事管的一套系统出现很严重的log file sync,然后他通过DBA_HIST_ACTIVE_SESS_HISTORY想查询是什么语句导致的这么严重的等待。最后查询出来的结果让他大吃一惊。在他关注的那几分钟内。有很多进程在等待log file sync,这些语句的SQL_ID是select。他提出了两个疑问,send email给我。那么我们来看看他提出的两个问题。

一、为什么select 语句也会遇到log file sync?
二、如何找出真正造成log file sync的语句?

首先,在回答这两个问题之前,我们要先要了解一下log file sync产生的原因。这里我拿出Tanel Pader大师的一副图来。

捕获1

如图所示,Log file sync是分成6部分的。

  √ 前台进程,也就是用户进程发起一个提交或者回滚的操作。
  √ 前台进程会通知Lgwr去写日志。
  √ LGWR会进行物理写的系统调用。
  √ 物理写调用完成。
  √ LGWR通知前台进程写入操作已完成。
  √
前台进程显示提交已经完成。

我们的步骤1-6是log file sync的过程,在3-4是log file parallel write的过程。所以log file sync包含了log file parallel write这个过程。弄明白log file sync是如何发生的之后,我们在来谈谈它的触发机制。

只要进行提交,就会产生log file sync。
  √ 用户进程提交。
  √ DDL操作,
我们执行了一些事务,然后执行一个DDL,他会隐式的进行提交。
  √ 某些操作递归产生对数据字典的DML操作。

当然回滚也会产生log file sync
  √ 用户进程回滚,发起rollback命令。
  √ 事务回滚,一些进程遇到ORA-错误,kill session等等。

了解了这些机制后,我们来回答第一个问题,为什么select 语句也会遇到log file sync?其实这个可能有三种情况。
第一种情况是因为视图DBA_HIST_ACTIVE_SESS_HISTORY的数据是采样获得的,可能会话发起了DML语句,再发起SELECT语句,最后执行了提交。这种情况很普遍,按照正常人的思维都是执行一个Update之后,我们在查看一下Update是否成功了,看到成功修改之后我们就提交。只不过在采样的时候采到了Select语句,因为最后执行的COMMIT这种语句是不会出现在SQL_ID当中的。

第二种情况是因为Select会产生延迟块清除。如果一个事务commit后,由于某些block在commit之前已经写回datafile, 或者事务影响到的block数过多,则commi的时候只会清理undo segment header中的事务表信息,data block上的事务标志不会清除,否则代价过高。那么在下一次读取这些block时,需要将这些事务标志进行清除,就是延迟块清除。延迟块清除也是需要Lgwr写redo的。

第三种情况是构造CR块,在我们执行了一个DML语句之后,我们另外一个会话再执行查询的操作,它会在内存中构造CR块,构造CR会在内存中对块进行修改,所以它会通过Lgwr记录到redo log当中。

这就解释了我们Select会产生log file sync的一个原因。至于第二个问题,如何找出引起log file sync的语句?我觉得这个根本就没有必要去找。我们解决log file sync的思路是要判断产生的原因。这个我推荐大家去看MOS上的文档。Troubleshooting: “log file sync” Waits (Doc ID 1376916.1)。这篇文档会告诉你从哪里入手去判断log file sync产生的原因。我们并不能简单的因为几个语句,就说它产生了log file sync,毕竟文档中提到了也会有I/O性能的问题,CPU争用导致写完redo之后LGWR无法post前台进程,提交过于频繁,redo log太小。log buffer过小等等,这些都有可能造成log file sync。所以最重要的还是先把这篇文档通读一遍,按照上面的思路去进行处理。我相信只要你按照文档中的思路去找,一定会找出一些蛛丝马迹出来。就算是一些疑难杂症,我们也还是可以通过Tanel Pader大师的snapper脚本对LGWR各种等待进行测量。最终定位出问题。
参考文档:
Troubleshooting: “log file sync” Waits (Doc ID 1376916.1)

分享到: 更多

Post a Comment

Your email is never published nor shared. Required fields are marked *