MySQL有多種日誌。不同種類、不同目的的日誌會記錄在不同的日誌文件中,它們可以幫助你找出mysqld內部發生的事情。比如錯誤日誌:用來記錄啓動、運行或停止mysqld進程時出現的問題;查詢日誌:記錄建立的客戶端連接和執行的語句;二進制日誌:記錄所有更改數據的語句,主要用於邏輯複製;慢日誌:記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢。而對MySQL中最常用的事務引擎innodb,redo日誌是保證事務一致性非常重要的。本文結合MySQL版本5.6爲分析源碼介紹MySQL innodb引擎的重做(Redo)日誌存儲格式。
Redo日誌
任何對Innodb表的變動, redo log都要記錄對數據的修改,redo日誌就是記錄要修改後的數據。redo 日誌是保證事務一致性非常重要的手段,同時也可以使在bufferpool修改的數據不需要在事務提交時立刻寫到磁盤上減少數據的IO從而提高整個系統的性能。這樣的技術推遲了bufferpool頁面的刷新,從而提升了數據庫的吞吐,有效的降低了訪問時延。帶來的問題是額外的寫redo log操作的開銷。而爲了保證數據的一致性,都要求WAL(Write Ahead Logging)。而redo 日誌也不是直接寫入文件,而是先寫入redo log buffer,而是批量寫入日誌。當需要將日誌刷新到磁盤時(如事務提交),將許多日誌一起寫入磁盤。
Redo日誌文件格式
MySQL redo日誌是一組日誌文件,它們會被循環使用。Redo log文件的大小和數目可以通過特定的參數設置,詳見innodb_log_file_size 和 innodb_log_files_in_group 。
日誌組結構
在實現上日誌組是由定義在log0log.h中的log_group_t結構體來表示的。在日誌組結構體定義中含有以下重要信息: 日誌文件的大小(file_size):記錄日誌組內每個日誌文件的大小,通過參數innodb_log_file_size配置。 日誌文件的個數(n_files): 記錄這個日誌組中的文件個數,,通過參數innodb_log_files_in_group配置。 Checkpoint相關