修改sync_binlog innodb_flush_log_at_trx_commit和sync_binlog参数 提高写入速度

alt

胸小的姑娘一般脾气都特大,胸大的姑娘一般脾气都特好,因为古语有云:穷凶极恶有容乃大!

前言

innodb_flush_log_at_trx_commitsync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数。

详细

innodb_flush_log_at_trx_commit

  • 如果innodb_flush_log_at_trx_commit设置为0log buffer将每秒一次地写入log file中,并且log fileflush(刷到磁盘)操作同时进行,该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
  • 如果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的时候,写入性能最差,sync_binlog=N (N>1 ) and innodb_flush_log_at_trx_commit=2 时,(在当前模式下)MySQL的写操作才能达到最高性能。

  • innodb_flush_log_at_trx_commitsync_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写能力足够支持业务,比如订单,交易,充值,支付消费系统。

推荐的做法是 innodb_flush_log_at_trx_commit=2sync_binlog=N (N为500 或1000) 且使用带蓄电池后备电源缓存cache,防止系统断电异常。

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

PS: 两个都为1的时候,导入数据约18分钟,优化后导入整库约3分钟。

1
2
innodb_flush_log_at_trx_commit=2 
sync_binlog=1000

-------------本文结束感谢您的阅读-------------
0%