# /etc/my.cnf [mysqld] log-bin = mysql-bin # 啟用,指定基礎文件名 binlog_format = ROW # 格式:ROW/STATEMENT/MIXED (推薦 ROW) max_binlog_size = 512M # 單文件上限 (1G 硬限制) expire_logs_days = 7 # 自動清理天數 binlog_cache_size = 4M # 事務緩存 (每會話) max_binlog_cache_size = 512M # 事務最大緩存 sync_binlog = 1 # 關鍵:每提交 1 次 fsync (最安全) # sync_binlog = 0 由 OS 決定 (性能最好,風險最大) # sync_binlog = N 每 N 次提交 fsync
| 格式 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| STATEMENT | 記錄原始 SQL | 文件小、易讀 | 非確定性函數( NOW/UUID )導致主從不一致 | 簡單業務、混合負載 |
| ROW | 記錄行級變更 | 絕對一致性、無函數問題 | 文件大、DDL 仍記 Statement | 核心業務、金融、強一致要求 |
| MIXED | 智能切換 | 折中 | 不可控、調試困難 | 過渡期、非核心庫 |
生產強烈建議 ROW 格式
# 查看當前 Binlog 列表
SHOW BINARY LOGS;
SHOW MASTER LOGS;
# 查看當前寫入文件
SHOW MASTER STATUS;
# 命令行查看文件內容
mysqlbinlog mysql-bin.000001 | more
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 # 解析 ROW 格式
# 指定時間範圍導出
mysqlbinlog --start-datetime="2024-01-01 00:00:00" \
--stop-datetime="2024-01-01 01:00:00" \
mysql-bin.000001 > /tmp/binlog_1h.sql
# 1. 最近全量備份恢復 mysql -uroot -p db_name < full_backup.sql # 2. 依次應用備份後的 Binlog (按序號順序) mysqlbinlog mysql-bin.000002 | mysql -uroot -p db_name mysqlbinlog mysql-bin.000003 | mysql -uroot -p db_name # ... 直到目標時間點 # 3. 或指定位點恢復 mysqlbinlog --stop-position=12345 mysql-bin.000003 | mysql -uroot -p db_name
# 按文件名清理 (保留指定文件及之後) PURGE BINARY LOGS TO 'mysql-bin.000010'; # 按時間清理 (保留指定時間及之後) PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00'; # 重置所有 (危險!僅用於全新主庫初始化) RESET MASTER;
SHOW GLOBAL STATUS LIKE 'Binlog%'; -- Binlog_cache_use: 使用內存緩存次數 -- Binlog_cache_disk_use: 寫臨時文件次數 (調大 binlog_cache_size) -- Binlog_stmt_cache_use / _disk_use: STATEMENT 格式專用
binlog_format = ROWsync_binlog = 1 (配合電池備援 RAID 卡寫緩存)expire_logs_days = 7 (配合備份週期)Binlog_cache_disk_use 增長 → 擴大 binlog_cache_size