首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 二進制日志與重做日志核心概念深度解析

     編輯:MySQL 資料庫相關知識

二進制日志(Binary Log)

二進制日志記錄了所有會修改數據庫數據的操作,主要服務於兩大核心場景:數據恢復與主從復制。

啟動與文件命名

通過配置參數 log-bin[=name] 啟用。若未指定名稱,默認以主機名為文件名,後綴為序列號(如 host-bin.000001),存放於數據目錄下。帶 .index 後綴的文件為索引文件,用於記錄所有已生成的二進制日志文件列表。

關鍵配置參數詳解

  • max_binlog_size:單個日志文件最大值(默認 1GB),超過則自動切換新文件(序列號 +1)。
  • binlog_cache_size:事務提交前,未提交事務的二進制日志暫存緩存大小(默認 32KB),基於會話分配。可通過 Binlog_cache_use 和 Binlog_cache_disk_use 狀態值評估設置是否合理。
  • sync_binlog=[N]:控制寫緩存 N 次後同步到磁盤。設為 1 即為同步寫入,配合 innodb_support_xa=1 可確保二進制日志與 InnoDB 數據文件的一致性。
  • binlog-do-db / binlog-ignore-db:指定需記錄或忽略的庫,默認記錄所有庫。
  • log-slave-updates:搭建 Master -> Slave -> Slave 架構時必開。
  • binlog_format(MySQL 5.1+ 引入):
    • STATEMENT:記錄 SQL 語句邏輯(傳統模式)。
    • ROW:記錄行級變更細節,允許將隔離級別設為 READ COMMITTED 以提升並發。
    • MIXED:默認用 STATEMENT,特定場景(NDB 引擎、不確定函數、INSERT DELAY、UDF、臨時表)自動切換 ROW。

重做日志(Redo Log)

InnoDB 專有,默認兩個文件 ib_logfile0、ib_logfile1,循環寫入。核心作用是崩潰恢復:實例或介質故障時,通過重做日志將未刷盤的數據頁恢復至一致性狀態。

影響重做日志的參數

  • innodb_log_file_size:單個日志文件大小。
  • innodb_log_files_in_group:日志文件組數量(默認 2)。
  • innodb_log_group_home_dir:日志文件存放路徑。

重做日志 vs 二進制日志:核心差異

維度二進制日志重做日志
記錄範圍所有存儲引擎的修改操作僅 InnoDB 事務相關
記錄內容邏輯操作(SQL 或行變更)頁級物理修改
寫入時機事務提交前一次性寫入事務執行過程中持續寫入

重做日志緩沖刷盤機制

受 innodb_flush_log_at_trx_commit 控制:

  • 0:提交時不寫盤,依賴後台線程每秒刷新(性能最好,風險最高)。
  • 1:提交時同步寫盤(默認,數據最安全)。
  • 2:提交時異步寫盤(折中方案,可能丟失 1 秒數據)。

此外,主線程每秒會無條件將緩沖刷盤。注意重做日志存在 capacity 限制,檢查點不能超過此閾值。

max_binlog_size 默認值 binlog_cache_size 默認值 重做日志相關參數

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved