简单解释一下:
sync_binlog=0 未开启mysql实例的binlog到磁盘的同步(binlog刷盘)。binlog的刷盘依赖与文件系统。
sync_binlog=1 在事务提交前将binlog刷到磁盘。这样设置比较安全,但是随着磁盘写的增加对性能有负面影响。
sync_binlog=N N不能是0或者1,收集到 N 个binlog提交组后,将binlog刷到磁盘。如果发生电源故障或操作系统崩溃,服务器可能提交了尚未刷新到binlog的事务。较高的值可提高性能,但会增加数据丢失的风险。
完全符合 ACID 需要默认设置 1。日志在每次事务提交时写入并刷新到磁盘。
设置为 0 时,每秒将日志写入并刷新到磁盘一次。未刷新日志的事务可能会在崩溃中丢失。
设置为 2 时,日志在每次事务提交后写入,并每秒刷新到磁盘一次。未刷新日志的事务可能会在崩溃中丢失。
对于设置 0 和 2,每秒刷新一次不能 100% 保证。由于 DDL 更改和其他内部 InnoDB 活动导致日志独立于 innodb_flush_log_at_trx_commit 设置刷新,刷新可能会更频繁地发生,有时由于调度问题而不太频繁。如果每秒刷新一次日志,则崩溃中可能会丢失多达一秒的事务。如果日志刷新频率高于或低于每秒一次,则可能丢失的事务量会相应地变化。
日志刷新频率由 innodb_flush_log_at_timeout 控制,它允许将日志刷新频率设置为 N 秒(其中 N 为 1 ... 2700,默认值为 1)。但是,任何 mysqld 进程崩溃都可以擦除最多 N 秒的事务。
DDL 更改和其他内部 InnoDB 活动独立于 innodb_flush_log_at_trx_commit 设置刷新日志。
无论 innodb_flush_log_at_trx_commit 设置如何,InnoDB 崩溃恢复都有效。交易要么完全应用,要么完全擦除。