二進制日志記錄了所有會修改數據庫數據的操作,主要服務於兩大核心場景:數據恢復與主從復制。
通過配置參數 log-bin[=name] 啟用。若未指定名稱,默認以主機名為文件名,後綴為序列號(如 host-bin.000001),存放於數據目錄下。帶 .index 後綴的文件為索引文件,用於記錄所有已生成的二進制日志文件列表。
Binlog_cache_use 和 Binlog_cache_disk_use 狀態值評估設置是否合理。innodb_support_xa=1 可確保二進制日志與 InnoDB 數據文件的一致性。Master -> Slave -> Slave 架構時必開。STATEMENT:記錄 SQL 語句邏輯(傳統模式)。ROW:記錄行級變更細節,允許將隔離級別設為 READ COMMITTED 以提升並發。MIXED:默認用 STATEMENT,特定場景(NDB 引擎、不確定函數、INSERT DELAY、UDF、臨時表)自動切換 ROW。InnoDB 專有,默認兩個文件 ib_logfile0、ib_logfile1,循環寫入。核心作用是崩潰恢復:實例或介質故障時,通過重做日志將未刷盤的數據頁恢復至一致性狀態。
innodb_log_file_size:單個日志文件大小。innodb_log_files_in_group:日志文件組數量(默認 2)。innodb_log_group_home_dir:日志文件存放路徑。| 維度 | 二進制日志 | 重做日志 |
|---|---|---|
| 記錄範圍 | 所有存儲引擎的修改操作 | 僅 InnoDB 事務相關 |
| 記錄內容 | 邏輯操作(SQL 或行變更) | 頁級物理修改 |
| 寫入時機 | 事務提交前一次性寫入 | 事務執行過程中持續寫入 |
受 innodb_flush_log_at_trx_commit 控制:
0:提交時不寫盤,依賴後台線程每秒刷新(性能最好,風險最高)。1:提交時同步寫盤(默認,數據最安全)。2:提交時異步寫盤(折中方案,可能丟失 1 秒數據)。此外,主線程每秒會無條件將緩沖刷盤。注意重做日志存在 capacity 限制,檢查點不能超過此閾值。
