所謂的雙一就是指:
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)寫入的時間也不同,二進制日志文件是在事務提交前進行記錄的,而在事務進行的過程中,不斷有重做日志條目被寫入重做日志文件中。