一、innodb_flush_log_at_trx_commit

  1. 参数解释
    0:log buffer 将每秒一次地写入 log file 中,并且 log file 的 flush (刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
    1:每次事务提交时 MySQL 都会把 log buffer 的数据写入 log file,并且 flush (刷到磁盘)中去,该模式为系统默认。
    2:每次事务提交时 MySQL 都会把 log buffer 的数据写入 log file,但是 flush (刷到磁盘)操作并不会同时进行。该模式下,MySQL 会每秒执行一次 flush (刷到磁盘)操作。
  2. 参数修改
    找到 mysql 配置文件 mysql.ini(一般默认为 /etc/my.cnf ),修改成合适的值,然后重启 mysql。
  3. 注意事项
    当设置为 0,该模式速度最快,但不太安全,mysqld 进程的崩溃会导致上一秒钟所有事务数据的丢失。
    当设置为 1,该模式是最安全的,但也是最慢的一种方式。在 mysqld 服务崩溃或者服务器主机 crash 的情况下,binary log 只有可能丢失最多一个语句或者一个事务。
    当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。

二、sync_binlog

  1. 参数解释
    该参数控制着二进制日志写入磁盘的过程。
    该参数的有效值为 0 、1、N:
    0:默认值。事务提交后,将二进制日志从缓冲写入磁盘,但是不进行刷新操作(fsync()),此时只是写入了操作系统缓冲,若操作系统宕机则会丢失部分二进制日志。
    1:事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。
    N:每写N次操作系统缓冲就执行一次刷新操作。
  2. 注意事项
    二进制日志文件涉及到数据的恢复,以及想在主从之间获得最大的一致性,那么应该将该参数设置为1,但同时也会造成一定的性能损耗。
    通常,会将这两个参数都设置成1来保证数据的安全,但是如果在某些情况下性能更重要,那么可以考虑将其设为其他值来获得最大的性能。

三、其他相关

innodb_flush_log_at_trx_commit 和 sync_binlog 两个参数是控制 MySQL 磁盘写入策略以及数据安全性的关键参数,当两个参数都设置为1的时候写入性能最差,网络看到的推荐做法是innodb_flush_log_at_trx_commit=2,sync_binlog=500 或1000