10-innodb_flush_log_at_trx_commit的设置
innodb_flush_log_at_trx_commit参数可以控制将 redo buffer中的更新记录写入到日志文件以及将日志文件数据刷新到磁盘的操作时机。通过调整这个参数,可以在性能和数据安全之间做取舍。
如果这个参数设置为 0,在事务提交时,InnoDB 不会立即触发将缓存日志写到磁盘文件的操作,而是每秒触发一次缓存日志回写磁盘操作,并调用操作系统fsync刷新IO缓存。
如果这个参数设置为1,在每个事务提交时,InnoDB立即将缓存中的redo日志回写到日志文件,并调用操作系统fsync刷新IO缓存。
如果这个参数设置为2,在每个事务提交时,InnoDB立即将缓存中的redo日志回写到日志文件,但并不马上调用fsync来刷新IO缓存,而是每秒只做一次磁盘IO缓存刷新操作。
innodb_flush_log_at_trx_commit参数的默认值是 1,即每个事务提交时都会从 log buffer写更新记录到日志文件,而且会实际刷新磁盘缓存,显然,这完全能满足事务的持久化要求,是最安全的,但这样会有较大的性能损失。
在某些情况下,我们需要尽量提高性能,并且可以容忍在数据库崩溃时丢失小部分数据,那么通过将参数innodb_flush_log_at_trx_commit设置成0或2都能明显减少日志同步IO,加快事务提交,从而改善性能。
将此参数设置成0,如果数据库崩溃,最后1秒钟的事务重做日志可能会由于未及写入磁盘文件而丢失,这种方式是效率最高的,但也是最不安全的。
将此参数设置成2,如果数据库崩溃,由于已执行重做日志写入磁盘操作,只是没有做磁盘 IO 刷新操作,因此,只要不发生操作系统崩溃,数据就不会丢失,这种方式是对性能和数据安全的折中,其性能和数据安全性介于其他两种方式之间。