innodb_flush_log_at_trx_commit=0,在送出事務時,InnoDB不會立即觸發将緩存日志寫到磁盤檔案的操作,而是每秒觸發一次緩存日志回寫磁盤操作,并調用作業系統fsync重新整理IO緩存。
innodb_flush_log_at_trx_commit=1,在每個事務送出時,InnoDB立即将緩存中的redo日志回寫到日志檔案,并調用作業系統fsync重新整理IO緩存。
innodb_flush_log_at_trx_commit=2,在每個事務送出時,InnoDB立即将緩存中的redo日志回寫到日志檔案,但并不馬上調用fsync來重新整理IO緩存,而是每秒隻做一次磁盤IO緩存重新整理操作。
預設值1是為了保證完整的ACID。當然,你可以将這個配置項設定為1以外的值來換取更高的性能,但是在系統崩潰的時候,你将會丢失1秒的資料。設定為0的話,mySQLd程序崩潰的時候,就會丢失最後1秒的事務。設定為2的話,隻有在作業系統崩潰或者斷電的時候才會丢失最後1秒的資料。InnoDB在做恢複的時候會忽略這個值。
刷寫其實是兩個操作,刷(flush)和寫(write),區分這兩個概念(兩個系統調用)是很重要的。在大多數的作業系統中,把Innodb的log buffer(記憶體)寫入日志(調用系統調用write),隻是簡單的把資料移到作業系統緩存中,作業系統緩存同樣指的是記憶體。并沒有實際的持久化資料。
是以,通常設定為0和2的時候,在崩潰或斷電的時候會丢失最後一秒的資料,因為這個時候資料隻是存在于作業系統緩存。之是以說“通常”,可能會有丢失不隻1秒的資料的情況,比如說執行flush操作的時候阻塞了。
設為1當然是最安全的,但性能也是最差的(相對其他兩個參數而言,但不是不能接受)。如果對資料一緻性和完整性要求不高,完全可以設為2,如果隻要求性能,例如高并發寫的日志伺服器,設定為0來獲得更高性能。