IT技术博客大学习 共学习 共进步

MySQL在切换binlog时会阻塞更新

那一剑的风情 2009-10-28 22:47:20 累计浏览 3,923 次

   版本5.0.51b-log,在max-binlog-size设置为700M或者更大时(这个值可能跟硬件性能有关),当binlog达到设置上限并切换成下一个binlog时,所有的更新语句就会被阻塞,不管多简单的语句。

   最开始在数据库慢查询里面发现偶尔的插入变慢怎么想也不明白,后来发现每次变慢的时间点和创建一个新的binlog的时间一致,然后经过测试,复现了此问题。

   目前没发现为什么会引起此问题,如果要解决的话可以考虑设置max_binlog_size=600M,如果系统对插入速度或者超时没有苛刻的要求的话也可以不理会这个问题:)

   最近还发现它不光阻塞更新,如果设置了replication那么它对从库的查询也有影响。

      在binlog切换时,会有一个Rotate_log_event产生,而slave同步到此event后也会让Relay-log切换。由于mysql写这种日志都是写入系统缓存后就不管了,导致切换文件时需要对旧文件进行fdatasync,这时候瞬间io压力会过大,耗时较长。这种情况会阻塞更新的线程,让replication延迟,影响查询....

      如果想解决此问题,可以调节系统/proc/sys/vm/下面 dirty_background_ratio、dirty_expire_centisecs、dirty_ratio、dirty_writeback_centisecs这几个值,或者设置sync_binlog和max_relay_log_size。

建议继续学习

  1. 关于IO的同步,异步,阻塞,非阻塞 (累计阅读 16,427)
  2. 利用binlog来恢复数据库 (累计阅读 5,085)
  3. 说说使用mysqlbinlog按时间查询二进制日志时容易疏忽的地方 (累计阅读 4,164)
  4. Linux下访问文件的基本模式 (累计阅读 4,105)
  5. 用insert delayed减少阻塞时间 (累计阅读 3,743)
  6. 总结一下遇到过的网络同步IO导致服务阻塞的问题 (累计阅读 3,584)
  7. Linux 核心编程 – fsync, write (累计阅读 3,465)
  8. mysql audit-访问日志记录 (累计阅读 3,127)
  9. 使用内置定时事件的功能来定时删除 binlog (累计阅读 2,885)
  10. 为什么binlog大小会大于max_binlog_size? (累计阅读 2,725)