胸小的姑娘一般脾气都特大,胸大的姑娘一般脾气都特好,因为古语有云:穷凶极恶有容乃大!
前言
innodb_flush_log_at_trx_commit
和sync_binlog
两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数。
详细
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的时候,写入性能最差,sync_binlog=N (N>1 )
and 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写能力足够支持业务,比如订单,交易,充值,支付消费系统。
推荐的做法是 innodb_flush_log_at_trx_commit=2
,sync_binlog=N (N为500 或1000)
且使用带蓄电池后备电源
的缓存cache
,防止系统断电异常。
系统性能和数据安全是业务系统高可用稳定的必要因素。我们对系统的优化需要寻找一个平衡点,合适的才是最好的,根据不同的业务场景需求,可以将两个参数做组合调整,以便是db系统的性能达到最优化。
PS: 两个都为1的时候,导入数据约18分钟,优化后导入整库约3分钟。
1
2 innodb_flush_log_at_trx_commit=2
sync_binlog=1000