二進制日誌記錄所有修改數據庫的事件(DDL/DML),是主從復制、數據恢復、審計分析的核心基礎。本文系統講解三種日誌格式特性、配置參數、查看工具與生產環境選型建議。
[mysqld]
log-bin = mysql-bin # 啟用 Binlog,指定基礎文件名
server_id = 100 # 必須唯一
binlog_format = ROW # 推薦格式(詳見下文)
expire_logs_days = 7 # 自動清理過期日誌
max_binlog_size = 100M # 單文件最大尺寸
sync_binlog = 1 # 每次提交刷盤,最高安全性
| 維度 | STATEMENT (SBR) | ROW (RBR) | MIXED |
|---|---|---|---|
| 記錄內容 | SQL 語句文本 | 每行數據變更前後圖像 | 根據語句類型自動選擇 |
| 優點 | 日誌體積小、網絡傳輸省、不要求主從表結構完全一致 | 絕對數據一致性、支援所有函數/存儲過程、減少鎖競爭 | 兼顧體積與安全,官方默認 |
| 缺點 | 非確定性函數(UUID、NOW())導致主從不一致、需記錄上下文信息 | 大批量更新產生日誌暴增(如 UPDATE 10萬行)、要求主從表結構完全一致 | 行為不確定,排查困難 |
| 適用場景 | 簡單業務、跨版本復制、表結構差異場景 | 金融核心、高一致性要求、混合負載 | 通用生產環境默認選擇 |
binlog_row_image = FULL | MINIMAL | NOBLOB
-- FULL(默認):記錄所有列前後值
-- MINIMAL:僅記錄修改的列(前值僅主鍵/唯一鍵,後值僅修改列)
-- NOBLOB:排除 BLOB/TEXT 類型列
建議:binlog_format=ROW + binlog_row_image=MINIMAL 平衡體積與完整性。
SHOW BINARY LOGS; -- 列出所有 Binlog 文件
SHOW MASTER STATUS; -- 當前寫入文件與位置
SHOW BINLOG EVENTS IN 'mysql-bin.000005' LIMIT 10; -- 解析事件
mysqlbinlog# STATEMENT 格式直接可讀
mysqlbinlog /var/lib/mysql/mysql-bin.000003
# ROW 格式需 -vv 解碼
mysqlbinlog -vv /var/lib/mysql/mysql-bin.000005
# 指定位置範圍
mysqlbinlog --start-position=1234 --stop-position=5678 /var/lib/mysql/mysql-bin.000005
# 導出為 SQL 文件(用於恢復)
mysqlbinlog --database=test_db /var/lib/mysql/mysql-bin.000005 > recover.sql


| 復制模式 | Binlog 格式要求 | 特點 |
|---|---|---|
| 基於語句復制 (SBR) | STATEMENT | 日誌小、靈活、但非確定性函數風險 |
| 基於行復制 (RBR) | ROW | 最安全、支援所有場景、需表結構一致 |
| 混合復制 | MIXED | MySQL 自動判斷,5.7.7+ 默認 |
[mysqld]
# 核心格式配置
binlog_format = ROW
binlog_row_image = MINIMAL
# 安全與性能
sync_binlog = 1 # 雙1配置配合 innodb_flush_log_at_trx_commit=1
binlog_checksum = CRC32 # 啟用校驗和防止損壞
binlog_rows_query_log_events = ON # 記錄原始 SQL(5.6.2+),便於審計
# 存儲管理
expire_logs_days = 14
max_binlog_size = 500M
log_bin_basename = /data/binlog/mysql-bin # 分離存儲磁盤
# GTID 模式(推薦)
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON
mysqlbinlog --start-datetime="2023-10-01 10:00:00" --stop-datetime="2023-10-01 10:05:00" mysql-bin.000010 > partial.sqlSET GLOBAL binlog_format = ROW;
SET SESSION binlog_format = STATEMENT; -- 當前會話臨時改變
注意:事務內不可修改,且混合模式下無法強制指定單條語句格式。
正確理解並配置 Binlog,是構建高可用、可審計、可恢復 MySQL 架構的基石。