MysqL 磁碟寫入策略之innodb_flush_log_at_trx_commit

OldBoy~發表於2017-12-25
本文從引數含義,效能,安全形度闡述兩個引數為不同的值時對db 效能,資料的影響,引擎是Innodb的前提下。

取值:0/1/2

innodb_flush_log_at_trx_commit=0,表示每隔一秒把log buffer刷到檔案系統中(os buffer)去,並且呼叫檔案系統的“flush”操作將快取重新整理到磁碟上去。也就是說一秒之前的日誌都儲存在日誌緩衝區,也就是記憶體上,如果機器崩潰,可能丟失1秒的事務資料,效能相比其後面的快點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的資料,例如高併發寫的日誌伺服器,設為0來獲得更高效能。

innodb_flush_log_at_trx_commit=1,表示在每次事務提交的時候,都把log buffer刷到檔案系統中(os buffer)去,並且呼叫檔案系統的“flush”操作將快取重新整理到磁碟上去。這樣的話,資料庫對IO的要求就非常高。

innodb_flush_log_at_trx_commit=2,表示在每次事務提交的時候會把log buffer刷到檔案系統中去,但並不會立即刷寫到磁碟,日誌仍然會每秒flush到硬碟。如果只是MySQL資料庫掛掉了,由於檔案系統沒有問題,那麼對應的事務資料並沒有丟失。只有在資料庫所在的主機作業系統損壞或者突然掉電的情況下,資料庫的事務資料可能丟失1秒之類的事務資料。這樣的好處,減少了事務資料丟失的概率,而對底層硬體的IO要求也沒有那麼高(log buffer寫到檔案系統中,一般只是從log buffer的記憶體轉移的檔案系統的記憶體快取中,對底層IO沒有壓力)。

圖摘自:楊奇龍部落格

 

 

0和2的區別是,
為0時,mysqld或作業系統crash則會導致1秒內的事務被丟失。
為2時,當作業系統crash或斷電會導致1秒內的事務被丟失。

效能而言(由快至慢):
0>2>1
安全性而言(由好至差):
1>2>0

 當innodb_flush_log_at_trx_commit和sync_binlog  都為 1 時是最安全的,在mysqld 服務崩潰或者伺服器主機crash的情況下,binary log 只有可能丟失最多一個語句或者一個事務。但是魚與熊掌不可兼得,雙11 會導致頻繁的io操作,因此該模式也是最慢的一種方式。

高併發模式下,當磁碟IO無法滿足業務需求時 比如11.11 活動的壓力。推薦的做法是 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N為500 或1000) 且使用帶蓄電池後備電源的快取cache,防止系統斷電異常。
 
 
 

相關文章