MySQL中innodb_flush_log_at_trx_commit的設置


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的話,my SQLd進程崩潰的時候,就會丟失最后1秒的事務。設置為2的話,只有在操作系統崩潰或者斷電的時候才會丟失最后1秒的數據。InnoDB在做恢復的時候會忽略這個值。

刷寫其實是兩個操作,刷(flush)和寫(write),區分這兩個概念(兩個系統調用)是很重要的。在大多數的操作系統中,把Innodb的log buffer(內存)寫入日志(調用系統調用write),只是簡單的把數據移到操作系統緩存中,操作系統緩存同樣指的是內存。並沒有實際的持久化數據。

所以,通常設置為0和2的時候,在崩潰或斷電的時候會丟失最后一秒的數據,因為這個時候數據只是存在於操作系統緩存。之所以說“通常”,可能會有丟失不只1秒的數據的情況,比如說執行flush操作的時候阻塞了。

設為1當然是最安全的,但性能也是最差的(相對其他兩個參數而言,但不是不能接受)。如果對數據一致性和完整性要求不高,完全可以設為2,如果只要求性能,例如高並發寫的日志服務器,設置為0來獲得更高性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM