Mysql redo log 日志中,如果直接将缓存日志写入磁盘,势必会影响系统的io开销,所以Mysql给出一种缓存到磁盘的策略,就是文件系统缓存page cache 什么时候到磁盘,可以根据实际情况来调整适合自己的业务系统的参数。
刷盘参数 innodb_flush_log_at_trx_commit 是Mysql调优中一项参数,也是Mysql面试中可能问到的问题。
如上图所示,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
innodb_flush_log_at_trx_commit = 0,它依赖于后台的进程,每隔1秒将重做日志缓存写到文件系统缓存,然后调用刷盘fsync 函数。这样当系统崩溃时,最多会丢失1秒钟的数据。
innodb_flush_log_at_trx_commit = 1
innodb_flush_log_at_trx_commit = 1,表示每次提交事务commit的时候,就将重做日志缓存写到文件系统缓存page cache,并调用fsync函数刷到重做日志文件redo.file中。
这样在系统崩溃的时候数据也不会丢失,但是每次都要写入磁盘,io性能较差。
innodb_flush_log_at_trx_commit = 2
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。