当前位置:首页 > 计算机相关 > mysql > 正文内容

sync_binlog和 innodb_flush_log_at_trx_commit的设置

piikee6年前 (2016-12-25)mysql335
 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就会有一次写操作;否则每个事务对应一个写操作。

1


二 性能

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

2


测试场景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
场景141000
场景233000
场景326000
场景433000

由此可见,当两个参数设置为双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://blog.itpub.net/22664653/viewspace-1063134/


扫描二维码推送至手机访问。

版权声明:本文由萍客小居发布,如需转载请注明出处。

本文链接:https://www.piikee.net/1229.html

分享给朋友:

相关文章

ubuntu等linux系统下如何让mysql后台执行

由于有几十亿条数据的表要进行某个重大工程修改。。。然后然后。。。好吧,直入主题,下面语句就是直接让mysql后台执行的:root@10-10-74-251:~# nohup mysql -u用户名 -p密码 -e "insert into...

myisamchk: error: myisam_sort_buffer_size is too small解决办法

用myisamchk修复一个被损坏的表,结果显示如下错误:root@10-10-74-251:/data/mysql_data/cmd5# myisamchk -r -f md5_core.MYI- recovering (with sor...

load方法快速导入数据库--mysql

LOAD DATA INFILE '1-10000000.txt' INTO TABLE md5_core(pwd);1-1000000.txt为要导入的文件名,md5_core为要导入的表,pwd为字段。输入这句命令之前,先执行 use...

mysql error(13)的解决办法

mysql自己重新搞数据库目录,或者通过apt-get updata &&apt-get upgrade升级后,出现了无法启动,看日志里面是error(13),可以确定是权限问题。解决办法:vi /etc/apparmor....

常用sql语句

insert ignore into md5(a,b,c,d,pid) select substring(md5(pwd),1,8),substring(md5(pwd),9,16),substring(md5(pwd),17,24),su...

PHP实现mysql加密算法mysql323和mysql5,即old_password()和password()两个mysql函数

由于mysql5.7之后,已经停用old_password函数了,所以这里用PHP实现mysql加密算法mysql323和mysql5,即old_password()和password()两个mysql函数,转载请注明来自萍客小居www.p...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。