前置條件
- 啟用
log_bin(my.cnf:log-bin=mysql-bin)。
- 知曉 binlog 檔案路徑(
SHOW BINARY LOGS)。
方法一:按時間區間恢復 (MySQL 4.1.4+)
# 1. 還原最後一次全備(假設備份於 09:00)
mysql -u root -p < full_backup_0900.sql
# 2. 重放 09:00 到事故前 (09:59:59) 的 binlog
mysqlbinlog --stop-datetime="2024-01-15 09:59:59" /var/log/mysql/mysql-bin.000123 | mysql -u root -p
# 3. 若事故後仍有正常業務,續重放 10:01:00 之後
mysqlbinlog --start-datetime="2024-01-15 10:01:00" /var/log/mysql/mysql-bin.000123 | mysql -u root -p
方法二:按位置精準恢復(推薦,避免秒級時間碰撞)
- 導出事故前後區間 SQL 供人工審閱:
mysqlbinlog --start-datetime="2024-01-15 09:55:00" --stop-datetime="2024-01-15 10:05:00" /var/log/mysql/mysql-bin.000123 > /tmp/review.sql
- 用編輯器搜尋破壞性語句(
DROP/TRUNCATE/DELETE 無 WHERE),記錄其 # at 368312 位置號。
- 精準重放:
mysqlbinlog --stop-position="368312" /var/log/mysql/mysql-bin.000123 | mysql -u root -p
mysqlbinlog --start-position="368315" /var/log/mysql/mysql-bin.000123 | mysql -u root -p
關鍵參數速查
| 參數 | 說明 |
| --start-datetime / --stop-datetime | 格式 YYYY-MM-DD HH:MM:SS |
| --start-position / --stop-position | binlog 位置號 (# at N) |
| -d db_name | 僅恢復指定資料庫 |
| -v / -vv | 顯示行級事件細節 |
最佳實踐
- 生產環境每日全備 + 每小時增量備份(
mysqldump --flush-logs --master-data=2 記錄 binlog 位置)。
- 異地備份 binlog 檔案,防單點存儲故障。
- 恢復演練每季一次,驗證 RTO/RPO 指標。
- 大表誤刪考慮
Flashback 工具(如 binlog2sql)生成反向 SQL,比全量重放快數量級。