MySQL支援使用者自定義在commit時如何将log buffer中的日志刷log file中。這種控制通過變量 innodb_flush_log_at_trx_commit 的值來決定。該變量有3種值:0、1、2,預設為1。但注意,這個變量隻是控制commit動作是否重新整理log buffer到磁盤。
- 當設定為1的時候,事務每次送出都會将log buffer中的日志寫入os buffer并調用fsync()刷到log file on disk中。這種方式即使系統崩潰也不會丢失任何資料,但是因為每次送出都寫入磁盤,IO的性能較差。
- 當設定為0的時候,事務送出時不會将log buffer中日志寫入到os buffer,而是每秒寫入os buffer并調用fsync()寫入到log file on disk中。也就是說設定為0時是(大約)每秒重新整理寫入到磁盤中的,當系統崩潰,會丢失1秒鐘的資料。
- 當設定為2的時候,每次送出都僅寫入到os buffer,然後是每秒調用fsync()将os buffer中的日志寫入到log file on disk。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPj1mYox2Vj5WNXlVMkdFZwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3UDN1UTMzUTM2IDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)