"innodb_flush_log_at_trx_commit"和"sync_binlog"是兩個關鍵參數,用于控制mysql的磁盤寫入策略和數據安全性。這兩個參數的取值不同會對性能和數據安全性產生不同的影響。它們在決定數據何時寫入磁盤以及是否進行同步寫入binlog的過程中發揮重要作用。
參數說明
innodb_flush_log_at_trx_commit
允許值:0,1,2
描述:當重新安排并批量處理與提交相關的I/O操作時,可以控制磁盤的寫入策略,嚴格遵守ACID合規性和高性能之間的平衡,該參數默認值為“1”。
- 0:日志緩存區將每隔一秒寫到日志文件中,并且將日志文件的數據刷新到磁盤上。該模式下在事務提交時不會主動觸發寫入磁盤的操作。
- 1:每次事務提交時mysql都會把日志緩存區的數據寫入日志文件中,并且刷新到磁盤中,該模式為系統默認。
- 2:每次事務提交時mysql都會把日志緩存區的數據寫入日志文件中,但是并不會同時刷新到磁盤上。該模式下,mysql會每秒執行一次刷新磁盤操作。
說明:
當設置為0,該模式速度最快,但不太安全,mysqld進程的崩潰會導致上一秒鐘所有事務數據的丟失。
當設置為1,該模式是最安全的,但也是最慢的一種方式。在mysqld服務崩潰或者服務器主機宕機的情況下,日志緩存區只有可能丟失最多一個語句或者一個事務。
當設置為2,該模式速度較快,較取值為0情況下更安全,只有在操作系統崩潰或者系統斷電的情況下,上一秒鐘所有事務數據才可能丟失。
sync_binlog
允許值:0~4,294,967,295
描述:同步binlog(mysql持久化到硬盤,或依賴于操作系統)。
說明:
默認情況下,并不是每次寫入時都將binlog日志文件與磁盤同步。因此如果操作系統或服務器崩潰,有可能binlog中最后的語句丟失。
為了防止這種情況,你可以使用“sync_binlog”全局變量(1是最安全的值,但也是最慢的),使binlog在每N次binlog日志文件寫入后與磁盤同步。
推薦配置組合
組合一
innodb_flush_log_at_trx_commit=1;sync_binlog=1;
場景:適合數據安全性要求非常高,而且磁盤寫入能力足夠支持業務。
組合二
innodb_flush_log_at_trx_commit=1;sync_binlog=0;
場景:適合數據安全性要求高,磁盤寫入能力支持業務不足,允許備庫落后或無復制。
組合三
innodb_flush_log_at_trx_commit=2;sync_binlog=0/N(0<N<100);
場景:適合數據安全性要求低,允許丟失一點事務日志,允許復制延遲。
組合四
innodb_flush_log_at_trx_commit=0;sync_binlog=0;
場景:磁盤寫能力有限,無復制或允許復制延遲較長。