MySQL Binlog 記錄所有資料變更,是主從複制與時間點恢復(PITR)的基石。事務性引擎與非事務性引擎的語句在 Binlog 中的寫入時機、緩衝機制截然不同。本文詳細解析三大寫入規則與實戰影響。
COMMIT 時,將緩衝內所有事件**一次性順序寫入** Binlog(保證原子性)。| 規則 | 條件 | 動作 | 說明 |
|---|---|---|---|
| 規則 1 | 語句被標記為事務性(如在事務中) | 寫入事務緩衝 | 隨事務提交一併刷盤 |
| 規則 2 | 未標記事務性,且事務緩衝為空 | **直接寫入 Binlog** | 自動提交模式下的單條 DML |
| 規則 3 | 未標記事務性,但事務緩衝非空 | 寫入事務緩衝 | 混合事務中夾雜非事務表操作 |
START TRANSACTION;
INSERT INTO innodb_table ...; -- 事務性,進緩衝
INSERT INTO myisam_table ...; -- 非事務性,但緩衝非空 → 規則3,進緩衝
COMMIT; -- 一次性刷盤
⚠️ **風險**:若事務後續 ROLLBACK,非事務表的修改**無法回滾**,但 Binlog 已記錄該操作 → **主從數據不一致**!
binlog_format=ROW,基於行變更記錄,減少語句級混合帶來的語意歧義。SHOW VARIABLES LIKE 'binlog_format';
SHOW VARIABLES LIKE 'sync_binlog'; -- 1 = 每次提交刷盤,最安全
SHOW ENGINE INNODB STATUS\G -- 觀察 Log buffer 與 Binlog 協同
Binlog 寫入機制:事務性進緩衝隨提交刷盤,非事務性看緩衝狀態決定直寫或進緩衝。混合操作是主從不一致溫床,**架構層面統一 InnoDB + ROW 格式** 是根治之道。