場景:大數據量表 + 主從復制 + 存在 INSERT INTO ... SELECT ... 類大事務。現象:主庫執行大事務時,Binlog 超過 1GB 限制,MySQL 自動切換為 ROW 格式同步,導致從庫同步失敗,唯有刪除自增列才能恢復主從。
max_binlog_size)max_binlog_cache_size 或單文件 1GB 時,MySQL 將該事務從 STATEMENT 格式強制轉為 ROW 格式寫入 BinlogINSERT INTO ... SELECT ... 在 STATEMENT 格式下僅記錄一條 SQL;轉為 ROW 格式後,展開為成千上萬條 INSERT INTO ... VALUES (...),體積指數級增長| 風險因子 | 低風險 | 高風險 |
|---|---|---|
| 表數據量 | < 1000 萬行 | > 1 億行 |
| 寫入模式 | 單行 INSERT / 批量小事務 | INSERT SELECT / LOAD DATA / 批量大事務 |
| 主從架構 | 單主單從 / GTID | 多級主從 / 異構複製 |
| Binlog 格式 | 固定 ROW / MIXED | STATEMENT (默認易切換) |
將 INSERT INTO target SELECT ... FROM source WHERE ... 拆分為多個小批次事務(如每 5000 行提交一次),應用層控制事務邊界,避免觸發 Binlog 切換。
max_binlog_size = 2G # 適當調大,但受限於文件系統/備份工具
max_binlog_cache_size = 4G # 允許更大事務緩存
binlog_format = ROW # 固定 ROW 格式,避免運行時切換帶來的不確定性
innodb_autoinc_lock_mode = 2 # 交錯模式,高併發下性能最佳,但 STATEMENT 格式下不安全
# 必須配合 binlog_format = ROW 使用
自增主鍵雖簡單高效,但在「大數據量 + 大事務 + STATEMENT Binlog + 主從」的組合拳下,是隱形殺手。架構設計時應評估業務寫入模式,優先拆分大事務,或採用分佈式 ID 生成策略,從根源消除風險。