Binlog 是 MySQL 複寫與時間點恢復的核心。格式選擇直接影響主從一致性、磁碟佔用、網路傳輸、複寫效能。本文從演進歷史、核心差異、適用場景、特殊物件處理、參數調優五個維度系統闡述。
# 動態修改(會話/全局)
SET SESSION binlog_format = 'MIXED';
SET GLOBAL binlog_format = 'MIXED';
# 永久生效寫入 my.cnf
[mysqld]
binlog_format = MIXED
推薦:MIXED(5.1.8+ 預設)。Statement 為主,遇不安全語句自動切 Row,兼顧效能與一致性。
| 版本 | 里程碑 |
|---|---|
| 3.23 | Statement-based Replication (SBR) 首發 |
| 5.1 | Row-based (RBR) + Mixed (MBR) 引入 |
| 5.5 | Semi-synchronous Replication(半同步,主等至少一從收到) |
| 5.6 | Parallel Replication(基於 Schema 並行)+ GTID |
| 5.7 | Group Commit based Parallel Replication(組提交並行,真正多線程) |
| 8.0 | Binary Log Transaction Compression、原生雙主、Clone Plugin |
master.info 記錄 Master 位置。ib_logfile*。INSERT ... SELECT、AUTO_INCREMENT 插入、無條件/小範圍 UPDATE/DELETE。UPDATE t SET a=1 WHERE b=1 影響 100 萬行 → 100 萬行事件 vs 1 條 Statement。ALTER TABLE 重建表 → 全表行事件,Binlog 暴增。UUID()、USER()、FOUND_ROWS()、SYSDATE()(除非 --sysdate-is-now)、RAND()、SLEEP()、LAST_INSERT_ID() 在存儲過程中等。以下場景自動從 STATEMENT 切換為 ROW:
UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT() 等AUTO_INCREMENT 表同時更新INSERT DELAYEDUUID())| 物件 | ROW | STATEMENT/MIXED |
|---|---|---|
| 觸發器 | 主從均有:正常。主有從無:正常(記錄行變更) | 主有從無:複寫成功但數據錯誤(觸發器 SQL 未執行)。主從均有:正常 |
| 函數 (UDF) | 記錄轉換後結果,從庫無需 UDF | 從庫無 UDF:複寫報錯。從庫有:正常 |
| 存儲過程 | 記錄內部 SQL,不記 CALL | 記錄內部 SQL,不記 CALL(5.0+) |
| 事件 | 記錄內部 SQL,默認 DISABLE ON SLAVE | 記錄內部 SQL,默認 DISABLE ON SLAVE |
[mysqld]
binlog_row_image = MINIMAL # 默認 FULL
FULL:記錄所有列前後值。MINIMAL:僅記錄變更列(INSERT/DELETE 仍全列),大幅減小 Binlog 體積、網路傳輸、記憶體佔用。NOBLOB:排除 BLOB/TEXT 列。binlog_format 記錄。
是否有非確定性函數/UDF/觸發器/存儲函數?
├─ 是 → 強烈建議 ROW 或 MIXED
└─ 否
├─ 大批量更新/ALTER TABLE 頻繁?
│ ├─ 是 → STATEMENT 或 MIXED(避免 Binlog 爆炸)
│ └─ 否
│ ├─ 跨版本複寫/異構從庫?
│ │ ├─ 是 → STATEMENT
│ │ └─ 否
│ │ ├─ 對一致性要求極高(金融/核心交易)?
│ │ │ ├─ 是 → ROW(配合 binlog_row_image=MINIMAL)
│ │ │ └─ 否 → MIXED(推薦預設)
SHOW BINARY LOGS / SHOW MASTER STATUS:檔案列表與當前位置。mysqlbinlog 工具解析:mysqlbinlog -v --base64-output=DECODE-ROWS binlog.000001。Seconds_Behind_Master、Slave_IO_Running/Slave_SQL_Running、Binlog 生成速率 (MB/s)、Relay Log 積壓。總結:現代 MySQL (5.7/8.0) 生產環境首選 MIXED + binlog_row_image=MINIMAL,核心交易庫可評估 ROW。SBR 僅適合純讀擴展、跨版本、極簡架構場景。定期 mysqlbinlog 抽樣驗證 Binlog 內容,建立複寫延遲告警,是運維底線。