Heartbeat+DRBD 或主從複製環境下,**數據零丟失**與**寫入性能**天然衝突。官方文檔明確指出:
為使 HA 真正生效,**必須**設置
innodb_flush_log_at_trx_commit=1和sync_binlog=1。但這會**嚴重降低寫入性能**。
| 值 | 行為 | 丟失風險 | 性能 |
|---|---|---|---|
| 0 | Log Buffer → Log File (每秒) → flush disk (每秒),提交不刷盤 | mysqld crash 丟 1 秒事務 | 最快 |
| 1 (默認/推薦 HA) | 每事務提交:Log Buffer → Log File → **fsync disk** | **零丟失** (單機) | 最慢 |
| 2 | 每事務提交:Log Buffer → Log File (OS cache),flush disk 每秒 | OS crash/掉電 丟 1 秒 | 中等 |
InnoDB 崩潰恢復 (Redo Log) 與此參數無關,重啟後自動重放/回滾,保證事務原子性。
| 值 | 行為 | 丟失風險 |
|---|---|---|
| 0 (默認) | 不主動 fsync,依賴 OS 刷盤 | 崩潰丟未刷盤 binlog 事件 → 主從斷裂、數據不一致 |
| N (>0) | 每 N 次 binlog 寫入 fsync 一次 | 丟至多 N-1 個事務/語句 |
| 1 (推薦 HA) | **每事務/語句 fsync binlog** | **零丟失** (單機) |
若磁碟帶 **BBWC (電池備寫緩存)** 或 **RAID 卡帶閃存**,sync_binlog=1 性能損耗極小。
[mysqld] innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog_format = ROW innodb_support_xa = ON # 內部 XA 協調雙 1 安全 # 若性能不可接受,且業務可容忍秒級丟失: # innodb_flush_log_at_trx_commit = 2 # sync_binlog = 100~1000
relay_log_purge=1, sync_relay_log=1, sync_master_info=1 (5.6+)。
3. 半同步複製 rpl_semi_sync_master=ON,至少 1 個 Slave 收到 Relay Log 才提交,進一步降低丟失窗口。
4. GTID 模式 (5.6+) 簡化故障切換,避免位置偏移。
innodb_flush_log_at_trx_commit=2, sync_binlog=1000,單獨實例隔離。
5. **升級 MySQL 8.0**:Redo Log 並行刷盤、Binlog 組提交 (Group Commit) 大幅優化雙 1 性能。
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'; SHOW VARIABLES LIKE 'sync_binlog'; -- 模擬寫入壓測 sysbench oltp_write_only --mysql-host=... --threads=64 --time=60 run