[mysqld]
log_bin = mysql-bin # 啟用二進制日志
binlog_format = ROW # 推薦 ROW 格式
expire_logs_days = 7 # 自動清理 7 天前日志
max_binlog_size = 1G # 單文件最大 1G
sync_binlog = 1 # 事務提交強制 fsync,防丟失
binlog_do_db = biz_db # 可選:只記錄指定庫(慎用,影響復制)
| 命令 | 作用 | 場景 |
|---|---|---|
| 列出所有 Binlog 文件及大小 | 磁盤空間檢查、手動清理參考 | |
| 顯示當前寫入文件及 Position | 備份前記錄位置、搭建從庫 | |
| 切換新 Binlog 文件 | 定時切割、配合備份策略 | |
| 刪除所有 Binlog,重置索引 | 測試環境重置、誤操作後重建 | |
| 刪除指定文件之前的所有日志 | 手動清理舊日志(從庫已同步確認後) | |
| 刪除指定時間前的日志 | 按時間清理 |
# 導出指定文件為 SQL 文本
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000005 > /tmp/binlog.sql
# 指定時間範圍導出
mysqlbinlog --start-datetime="2024-01-15 10:00:00" \
--stop-datetime="2024-01-15 12:00:00" \
mysql-bin.000005 > /tmp/recover.sql
# 指定位置範圍導出(更精確)
mysqlbinlog --start-position=12345 --stop-position=67890 \
mysql-bin.000005 > /tmp/recover.sql
# 只導出特定庫(配合 --database,需 Statement/Mixed 格式)
mysqlbinlog --database=biz_db mysql-bin.000005 > /tmp/db.sql
SHOW MASTER STATUS 記錄)。mysqlbinlog --start-position=471632 \
--stop-datetime="2024-01-15 14:30:00" \
mysql-bin.000007 | mysql -u root -p biz_db
關鍵點: 必須先恢復全量備份,再應用增量 Binlog。
場景:14:30 執行了 DROP TABLE users,需恢復到 14:29:59。
mysqlbinlog --start-datetime="2024-01-15 14:25:00" \
--stop-datetime="2024-01-15 14:35:00" \
mysql-bin.000007 > /tmp/analyze.sql
analyze.sql,搜索 DROP TABLE,記下其 # at position(如 368312)。# 1. 恢復到誤操作之前
mysqlbinlog --stop-position=368312 mysql-bin.000007 | mysql -u root -p biz_db
# 2. 跳過誤操作,恢復之後的業務
mysqlbinlog --start-position=368315 mysql-bin.000007 | mysql -u root -p biz_db
# 從全量 Binlog 中只重放 biz_db 的操作
mysqlbinlog --stop-datetime="2024-01-15 14:30:00" \
mysql-bin.000007 | mysql -u root -p --one-database biz_db
原理: mysql 客戶端 --one-database 參數會過濾非目標庫的語句(僅 Statement 格式有效)。ROW 格式需先 mysqlbinlog -v 解碼後再用工具過濾。
1. 確認故障時間點 T_fault
2. 找到 T_fault 之前最近的全量備份(物理/邏輯)
3. 恢復全量備份到目標實例
4. 獲取備份對應的 Binlog 起始位置 (File, Pos)
5. 使用 mysqlbinlog 導出 [Pos, T_fault) 區間增量 SQL
6. (可選) 分析 SQL,剔除誤操作語句
7. 管道導入目標庫:mysqlbinlog ... | mysql -u root -p target_db
8. 驗證關鍵表行數、核心業務數據一致性
9. 切換流量/驗證應用正常
-v --base64-output=DECODE-ROWS 才能看到可讀 SQL,否則為 Base64 編碼。SET @@SESSION.GTID_NEXT,建議用 mysqlbinlog --skip-gtids 去除 GTID 事件後再導入。SET NAMES utf8mb4 與原庫一致,避免亂碼。INSERT/UPDATE/DELETE/CREATE 權限。