MySQL的事务日志中,为了性能和效率,可以配置每次事务提交后是否将日志缓冲刷到log file以进行数据持久化,这就是变量innodb_flush_log_at_trx_commit的作用。innodb_flush_log_at_trx_commit有3种值:0、1、2,默认为1。但注意,这个变量只是控制commit动作是否刷新log buffer到磁盘,而没有其它的数值意义。本文地址:http://www.04007.cn/article/794.html,未经许可,不得转载.
当设置为1的时候:事务每次提交都会将log buffer中的日志写入os buffer并调用fsync()刷到log file on disk中。这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
当设置为0的时候:事务提交时不会将log buffer中日志写入到os buffer,而是每秒写入os buffer并调用fsync()写入到log file on disk中。也就是说设置为0时是(大约)每秒刷新写入到磁盘中的,当系统崩溃,最多会丢失1秒钟的数据。
当设置为2的时候:每次提交都仅写入到os buffer,然后是每秒调用fsync()将os buffer中的日志写入到log file on disk。本文地址:http://www.04007.cn/article/794.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/794.html,未经许可,不得转载.
在主从MYSQL结构中,要保证事务的持久性和一致性,需要对日志相关变量设置为如下。
1.如果启用了二进制日志主从同步,则主设置sync_binlog=1,即每提交一次事务同步写到磁盘中。
2.设置innodb_flush_log_at_trx_commit=1,即每提交一次事务都写到磁盘中持久化。
上述两项变量的设置保证了:每次提交事务都写入二进制日志和事务日志,并在提交时将它们刷新到磁盘中以同步到从库。本文地址:http://www.04007.cn/article/794.html,未经许可,不得转载.
innodb_flush_log_at_trx_commit的值分别为0、1、2时的差距有多大呢?其实值为2和0的差距并不太大,但2却比0要安全的多。它们都是每秒从os buffer刷到磁盘,它们之间的时间差体现在log buffer刷到os buffer上。因为将log buffer中的日志刷新到os buffer只是内存数据的转移,并没有太大的开销,所以每次提交和每秒刷入差距并不大。但他们都与值为1的性能相差太多。尽管设置为0和2可以大幅度提升插入性能,但是在故障的时候可能会丢失1秒钟数据,这1秒钟很可能有大量的数据,所以默认值和一般企业这里的值都设置的是1.本文地址:http://www.04007.cn/article/794.html,未经许可,不得转载.
另外有个变量 innodb_flush_log_at_timeout 其默认值为1秒,该变量表示的是刷日志的频率,有很多人误以为是控制 innodb_flush_log_at_trx_commit 值为0和2时的1秒频率,实际上并非如此。测试时将频率设置为5和设置为1,当 innodb_flush_log_at_trx_commit 设置为0和2的时候性能基本都是不变的。关于这个频率是控制什么的?innodb在这些事务之外还有其它的控制规则,即几秒刷一次?这个刷日志的频率即由变量 innodb_flush_log_at_timeout 值决定,默认是1秒。但要注意,这个刷日志频率和commit动作是无关的,即和innodb_flush_log_at_trx_commit的值没有关联。本文地址:http://www.04007.cn/article/794.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/794.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |