innodb_flush_log_at_trx_commi 这个指的是写redo及后续操作,ib_logfile这个文件的刷新方式。
sync_binlog纯粹指的是binlog ,如 mysql-bin0003等。
基于innodb_flush_log_at_trx_commit 的三个参数的解释。
innodb_flush_log_at_trx_commit参数控制事务提交时写重做日志的行为方式,它有三个值:0、1和2。
(1)默认值为1,每次事务提交的时候都会将日志缓存中的数据写入到日志文件,同时还会触发文件系统到磁 盘的同步,如果发生系统崩溃,数据是零丢失,这种方式对数据是最安全的,但性能是最慢的,因为把数据从 缓存同步到磁盘的成本很高。这种方式适用于对数据安全性要求高的行业,如银行业。但很多互联网的应用, 对数据的安全性要求不太高,而对性能的要求很高,设置成0或2会更合适。
(2)设置成0时,事务提交的时候不会触发写日志文件的操作,日志缓存中的数据以每秒一次的频率写入到日 志文件中,同时还会进行文件系统到磁盘的同步操作。
(3)设置成2时,事务提交的时候会写日志文件,但文件系统到磁盘的同步是每秒进行一次。 0和2都是每秒进行一次文件系统到磁盘的同步,因此这两种方式的性能都差不多,当系统崩溃时,最多丢失1 秒的数据。但0和2还有细微的不同,当设置成2时,每次事务提交都写日志文件,因此数据已经从MySQL的日 志缓存刷新到了操作系统的文件缓存,如果只是MySQL崩溃,而操作系统没有崩溃,将不会丢失数据。因此0 和2比较起来,通常设置为2比较好。
性能最好的测试:
innodb_flush_log_at_trx_commit=2
sync_binlog=1000
sync_binlog:
该参数控制着二进制日志写入磁盘的过程。
该参数的有效值为0 、1、N:
0:默认值。事务提交后,将二进制日志从缓冲写入磁盘,但是不进行刷新操作(fsync()),此时只是写入了操作系统缓冲,若操作系统宕机则会丢失部分二进制日志。
1:事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。
N:每写N次操作系统缓冲就执行一次刷新操作。
将这个参数设为1以上的数值会提高数据库的性能,但同时会伴随数据丢失的风险。
二进制日志文件涉及到数据的恢复,以及想在主从之间获得最大的一致性,那么应该将该参数设置为1,但同时也会造成一定的性能损耗。
innodb_flush_method :
1. fsync:是默认值,使用fsync()系统调用刷新数据文件和日志文件,数据会在操作系统的缓存 中保存。
2. O_DSYNC:InnoDB使用O_SYNC打开和刷新日志文件,使用fsync()刷新数据文件。
3. O_DIRECT:使用O_DIRECT打开数据文件,使用fsync()系统调用刷新数据文件和日志文件, 数据不会在操作系统的缓存中保存。
4. O_DIRECT_NO_FSYNC:使用O_DIRECT刷新I/O,但写磁盘时不执行fsync()。