天天看點

redo log的重新整理政策

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。
redo log的重新整理政策