Mysql redo log 日志中,如果直接将缓存日志写入磁盘,势必会影响系统的io开销,所以Mysql给出一种缓存到磁盘的策略,就是文件系统缓存page cache 什么时候到磁盘,可以根据实际情况来调整适合自己的业务系统的参数。

刷盘参数 innodb_flush_log_at_trx_commit 是Mysql调优中一项参数,也是Mysql面试中可能问到的问题。

Mysql redo log 刷盘

如上图所示,Mysql 中 InnoDB引擎 redo日志由3个部分组成:

  • 重做日志缓存  redo log buffer
  • 文件系统缓存  page cache
  • 重做日志文件  redo.file 

其中所说的刷盘fsync策略参数 innodb_flush_log_at_trx_commit 指的是 文件系统缓存 page cache 到 重做日志缓存redo.file 的策略。

innodb_flush_log_at_trx_commit 参数值可以为0,1,2 ,其中1是默认值。

下面分别介绍这3个参数的含义。

innodb_flush_log_at_trx_commit = 0

Mysql redo log 刷盘参数

innodb_flush_log_at_trx_commit = 0,它依赖于后台的进程,每隔1秒将重做日志缓存写到文件系统缓存,然后调用刷盘fsync 函数。这样当系统崩溃时,最多会丢失1秒钟的数据。

innodb_flush_log_at_trx_commit = 1

Mysql redo log 刷盘参数

innodb_flush_log_at_trx_commit = 1,表示每次提交事务commit的时候,就将重做日志缓存写到文件系统缓存page cache,并调用fsync函数刷到重做日志文件redo.file中。

这样在系统崩溃的时候数据也不会丢失,但是每次都要写入磁盘,io性能较差。

innodb_flush_log_at_trx_commit = 2

Mysql redo log 刷盘参数

innodb_flush_log_at_trx_commit = 2,表示每次提交事务commit的时候,就将重做日志缓存写到文件系统缓存page cache,如果只是Mysql挂了,不会有任何数据的丢失,但是操作系统宕机可能会有1秒数据的丢失,这种情况下无法满足ACID中的D,但是数值2是效率最高的。

总结

不同的业务场景对数据的要求不一样,根据需要调整innodb_flush_log_at_trx_commit 参数可以提升Mysql的性能。

  • 在进行一些数据的导入处理的时候可以将参数innodb_flush_log_at_trx_commit 设为0。
  • 在高并发的情况下,可以将innodb_flush_log_at_trx_commit 设为2,既保证数据的可靠性和数据库的性能。
  • 在对数据的要求非常严苛的情况下可以将innodb_flush_log_at_trx_commit 设为1。