MySQL核心之双一原则
所谓的双一就是指:
sync_binlog=1; innodb_flush_log_at_trx_commit=1
innodb_flush_log_at_trx_commit和sync_binlog这两个参数是控制MySQL磁盘写入策略以及数据安全性的关键参数。
innodb_flush_log_at_trx_commit表示log buffer写入log file以及刷新到磁盘的过程,
sync_binlog表示事务写入binary log并使用fdatasync()函数同步到磁盘的过程。
1、对于innodb_flush_log_at_trx_commit来说
取值为0:log buffer每秒写入日志文件log file并刷新flush到磁盘。这种情况下,MySQL的日志刷写操作和事务提交操作没有关系。因此MySQL的性能是最好的时刻。不过不安全
取值为1:每次事务提交时,log buffer会被写入到日志文件并且还要刷写到磁盘上。由于每次事务都要提交到I/O设备,因此会慢一点,不过是最安全的。
取值为2:0和1的中间效果,即每次的事务提交会写入log buffer,而刷写到磁盘则是一秒进行一次。性能属于一般。
2、对于sync_binlog来说:
取值为0:MySQL自己不主动同步,依赖操作系统本身不定期把文件内容刷新到磁盘。性能最佳
取值为1:每次事务提交后将binlog_cache中的数据强制写入磁盘bin log日志中,是最慢的,但是最安全
取值 >1:当进行n次事务提交后,MySQL将binlog_cache中的数据强制写入磁盘中。
当两个参数都设为1,这适用于那些数据安全要求比较高的场合,同时要求磁盘等也比较好才行。
对于重做日志redo log和二进制bin log的区别是什么,我们有必要说一下:
1)二进制日志会记录所有与mysql有关的日志记录,包括InnoDB等其他存储引擎的日志,而InnoDB存储引擎的重做日志只记录有关其本身的事务日志, 2)记录的内容不容,不管你将二进制日志文件记录的格式设为哪一种,其记录的都是关于一个事务的具体操作内容,而InnoDB存储引擎的重做日志文件记录的关于每个页的更改的物理情况; 3)写入的时间也不同,二进制日志文件是在事务提交前进行记录的,而在事务进行的过程中,不断有重做日志条目被写入重做日志文件中。