Mysql默認情況下會有兩個文件:ib_logfile0和ib_logfile1,這兩個文件就是重做日志文件,或者事務日志。
重做日志的目的:萬一實例或者介質失敗,重做日志文件就能派上用場。
每個InnoDB存儲引擎至少有一個重做日志文件組,每個文件組下至少有2個重做日志文件,如默認的ib_logfile0、ib_logfile1。InnoDB存儲引擎先寫重做日志文件1,當達到文件的最后時,會切換至重做日志文件2,當重做日志文件2也被寫滿時,會再被切換到重做日志文件1中。
影響重做日志的參數:
Innodb_log_file_size、innodb_log_files_in_group、innodb_log_group_home_dir影響着重做日志文件的屬性。
重做日志與二進制日志的區別:
1)二進制日志會記錄所有與mysql有關的日志記錄,包括InnoDB等其他存儲引擎的日志,而InnoDB存儲引擎的重做日志只記錄有關其本身的事務日志,
2)記錄的內容不容,不管你將二進制日志文件記錄的格式設為哪一種,其記錄的都是關於一個事務的具體操作內容,而InnoDB存儲引擎的重做日志文件記錄的關於每個頁的更改的物理情況;
3)寫入的時間也不同,二進制日志文件是在事務提交前進行記錄的,而在事務進行的過程中,不斷有重做日志條目被寫入重做日志文件中。
從日志緩沖寫入磁盤上的重做日志文件的條件:
在主線程中每秒會將重做日志緩沖寫入磁盤的重做日志文件中,不論事務是否提交。另一個觸發這個過程是由參數innodb_flush_log_at_trx_commit控制,表示在提交時,處理重做日志的方式。
參數innodb_flush_log_at_trx_commit可設的值有0、1、2,0代表當提交事務時,並不將事務的重做日志寫入磁盤上的日志文件,而是等待主線程每秒的刷新,而1和2不同的地方在於:1是在commit時將重做日志緩沖同步寫到磁盤;2是重做日志異步寫到磁盤,即不能完全保證commit時肯定會寫入重做日志文件,只是有這個動作。
值得注意的一點:因為重做日志有個capacity變量,該值代表了最后的檢查點不能超過這個閥值。