首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 二進制日誌時間點恢復實戰:mysqlbinlog --start-date/--stop-position 精準還原

     編輯:MySQL 資料庫相關知識

前置條件

  • 啟用 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

方法二:按位置精準恢復(推薦,避免秒級時間碰撞)

  1. 導出事故前後區間 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
  2. 用編輯器搜尋破壞性語句(DROP/TRUNCATE/DELETE 無 WHERE),記錄其 # at 368312 位置號。
  3. 精準重放:
    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-positionbinlog 位置號 (# at N)
-d db_name僅恢復指定資料庫
-v / -vv顯示行級事件細節

最佳實踐

  • 生產環境每日全備 + 每小時增量備份(mysqldump --flush-logs --master-data=2 記錄 binlog 位置)。
  • 異地備份 binlog 檔案,防單點存儲故障。
  • 恢復演練每季一次,驗證 RTO/RPO 指標。
  • 大表誤刪考慮 Flashback 工具(如 binlog2sql)生成反向 SQL,比全量重放快數量級。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved