首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 二進制日志與重做日志核心原理深度解析

     編輯:MySQL 綜合教學

MySQL 二進制日志與重做日志核心原理深度解析

一、二進制日志

作用:

  1. 恢復:時間點恢復 (PITR)。
  2. 復制:主庫 binlog 傳給從庫重放。

啟動與文件結構

  • 參數:log-bin[=name],默認文件名為 主機名-bin.序列號,存放於數據目錄。
  • .index 文件:記錄歷史 binlog 文件列表,用於輪換管理。

關鍵參數詳解

參數說明默認值 (5.5/5.6+)
max_binlog_size單個 binlog 文件最大值,超過則輪換1G (1073741824)
binlog_cache_size事務期間緩存 binlog 的會話級內存大小32KB
sync_binlog每 N 次寫入緩存同步刷盤。1 為最安全 (同步寫入),需配合 innodb_support_xa=1 保證 XA 事務一致性0 (異步)
binlog-do-db / binlog-ignore-db指定/忽略記錄的庫空 (所有庫)
log-slave-update從庫是否將復制事件寫入自己的 binlog (鏈式復制必開)OFF
binlog_formatSTATEMENT (SQL 邏輯) / ROW (行變更) / MIXED (混合)。ROW 格式可配合 READ COMMITTED 獲得更高並發MIXED (5.7+) / STATEMENT (舊版)

MIXED 格式自動切換 ROW 的場景

  • 表使用 NDB 引擎。
  • 使用不確定函數:UUID(), USER(), CURRENT_USER(), FOUND_ROWS(), ROW_COUNT()。
  • 使用 INSERT DELAYED。
  • 使用用戶自定義函數 (UDF)。
  • 使用臨時表。

二、重做日志

文件:默認 ib_logfile0, ib_logfile1 (循環寫入)。

目的:實例/介質故障後的崩潰恢復,保證事務持久性 (WAL 機制)。

關鍵參數

  • innodb_log_file_size:單個重做日志文件大小。
  • innodb_log_files_in_group:日志文件組數量 (默認 2)。
  • innodb_log_group_home_dir:日志文件目錄。

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

維度二進制日志重做日志
記錄範圍所有存儲引擎的邏輯操作僅 InnoDB 事務的物理頁修改
記錄內容邏輯 SQL (STATEMENT) 或行變更 (ROW)頁級物理修改
寫入時機事務提交 前 (組提交時刻)事務執行 過程中 持續寫入
用途PITR、主從復制崩潰恢復、事務持久化

四、重做日志刷盤機制

參數 innodb_flush_log_at_trx_commit:

  • 0:提交時不寫日志文件,依賴後台線程每秒刷盤 (性能最好,可能丟 1 秒數據)。
  • 1:提交時 同步 寫入並 fsync 到磁盤 (最安全,ACID 完全保證)。
  • 2:提交時寫入 OS 緩存 (write),不保證 fsync (折中,掛電可能丟數據)。

注意:重做日志有容量上限,檢查點不能超過最老未刷盤的 LSN。

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