图片 4

(转)【MySQL】sync_binlog innodb_flush_log_at_trx_commit 浅析

一. innodb_flush_log_at_trx_commit

 这个参数名称有个log,一看就是与日志有关。是指:用来控制缓冲区(log
buffer)中的数据写入到日志文件(log
file),以及日志文件数据刷新到磁盘(flush)的操作时机。对这个参数的设置值,可以对数据库在性能与数据安全之间,进行折中。 

  参数值解释:

    当参数是0:日志缓冲数据会,每秒一次地写入到日志文件,并且把日志文件刷新到磁盘操作。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。

    当参数是1:每次事务提交时,日志缓冲被写到日志文件,并且对日志文件做磁盘刷新操作,该模式为系统默认。但由于每次事务都需要进行磁盘I/O,所以也最慢。

    当参数是2:每次事务提交时,日志缓冲被写到日志文件,但不对日志文件做磁盘刷新操作。对日志文件每秒执行一次,刷到磁盘操作。

  当设置innodb_flush_log_at_trx_commit=1时,
是默认值,也是最安全的设置,但是在这种模式下性能有一定的损失。
如果设置成0或者2 性能会有所改善,但有数据丢失的风险。
  设置成0则数据库崩溃的时候,那些没有被写入日志文件的事务丢失,最多丢失1秒钟的事务,是最不安全的,但也是效率最高的。
  设置成2则只是没有刷新到磁盘,但已经写入日志文件,所以只要操作系统没有崩溃,
那么并没有数据丢失, 比设置成0更安全。
  在mysql官方中,
为了确保事务的持久性和复制设置的一致性,都是建议将这个参数值设置为1。对于一些数据一致性和完整性要求不高的应用,配置为
2 就足够了;如果为了最高性能,可以设置为
0。有些应用,如支付服务,对一致性和完整性要求很高,所以即使最慢,也最好设置为
1。

参数值

数据安全性

I/O性能

0

安全最差。当数据库崩溃,有丢失1秒钟的事务风险

最优

1

安全最好。无丢失数据

最差

2

安全折中。当操作系统崩溃, 有丢失1秒钟的事务风险

折中

  1.1 查看日志提交方式

  SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

    图片 1

  1.2 修改参数值

           还是一样找到my.cnf, 修改参数值

           [root@xuegod64 ~]# cd /etc

           [root@xuegod64 etc]# vim my.cnf
    图片 2

    [root@xuegod64 ~]# systemctl stop mysqld.service

    [root@xuegod64 ~]# systemctl start  mysqld.service

-- 再次查看
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

    图片 3

原文:http://blog.itpub.net/22664653/viewspace-1063134/

二. sync_binlog  

  这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。在MySQL中系统默认的设置是sync_binlog=1。对于“sync_binlog”参数的各种设置的说明如下:

  sync_binlog=0:当事务提交之后,不主动刷新二进制日志文件的数据到磁盘上,而是由操作系统决定。

  sync_binlog=n:每向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上。

  而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。|

--  查看binlog写入方式
SHOW VARIABLES LIKE 'sync_binlog';

  图片 4

  总结: 在数据安全与性能以日志文件作为出发点时,我认为功能上与sql
server 的数据恢复模式比较相像,但实现的思路是不一样的。
  innodb_flush_log_at_trx_commit和sync_binlog是MySQL
innodb引擎的两个重要的参数,其中innodb_flush_log_at_trx_commit是将事务日志从innodb
log buffer刷新到磁盘,sync_binlog是将二进制日志文件刷新到磁盘上。
  innodb_flush_log_at_trx_commit和sync_binlog
两个参数是控制MySQL
磁盘写入策略以及数据安全性的关键参数,当两个参数都设置为1的时候写入性能最差,
网上也有说将innodb_flush_log_at_trx_commit=2,sync_binlog=500
或1000。有说对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。总体上还是要根据业务来判断,在性能和安全上做个选择。

 innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL
磁盘写入策略以及数据安全性的关键参数。本文从参数含义,性能,安全角度阐述两个参数为不同的值时对db
性能,数据的影响.

一 参数意义

innodb_flush_log_at_trx_commit

如果innodb_flush_log_at_trx_commit设置为0,log
buffer将每秒一次地写入log file中,并且log
file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log
buffer的数据写入log file,并且flush(刷到磁盘)中去.
如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log
buffer的数据写入log
file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次
flush(刷到磁盘)操作。

 

注意:

  由于进程调度策略问题,这个“每秒执行一次
flush(刷到磁盘)操作”并不是保证100%的“每秒”。

  

sync_binlog

sync_binlog
的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary
log。

当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary
log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

注:

 
 如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作。

   根据上述描述,我做了一张图,可以方便大家查看。
  图片 5

二 性能

    两个参数在不同值时对db的纯写入的影响表现如下:

    图片 6

 测试场景1 

  innodb_flush_log_at_trx_commit=2 

  sync_binlog=1000

 测试场景2 

  innodb_flush_log_at_trx_commit=1 

  sync_binlog=1000

 测试场景3 

  innodb_flush_log_at_trx_commit=1 

  sync_binlog=1

 测试场景4

  innodb_flush_log_at_trx_commit=1

  sync_binlog=1000

 测试场景5 

  innodb_flush_log_at_trx_commit=2 

  sync_binlog=1000 

 

场景 TPS
场景1 41000
场景2 33000
场景3 26000
场景4 33000

由此可见,当两个参数设置为双1的时候,写入性能最差,sync_binlog=N
(N>1 ) innodb_flush_log_at_trx_commit=2
时,(在当前模式下)MySQL的写操作才能达到最高性能。

三 安全

当innodb_flush_log_at_trx_commit和sync_binlog 
都为 1 时是最安全的,在mysqld
服务崩溃或者服务器主机crash的情况下,binary log
只有可能丢失最多一个语句或者一个事务。但是鱼与熊掌不可兼得,双11
会导致频繁的io操作,因此该模式也是最慢的一种方式。

当innodb_flush_log_at_trx_commit设置为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
当innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。

 

双1适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如订单,交易,充值,支付消费系统。双1模式下,当磁盘IO无法满足业务需求时
比如11.11 活动的压力。推荐的做法是 innodb_flush_log_at_trx_commit=2
,sync_binlog=N (N为500 或1000)
且使用带蓄电池后备电源的缓存cache,防止系统断电异常。

 

 

四 小结

 
  系统性能和数据安全是业务系统高可用稳定的必要因素。我们对系统的优化需要寻找一个平衡点,合适的才是最好的,根据不同的业务场景需求,可以将两个参数做组合调整,以便是db系统的性能达到最优化。

 

参考文章

http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

http://dev.mysql.com/doc/refman/5.1/en/replication-options-binary-log.html#sysvar_sync_binlog