# /etc/my.cnf [mysqld] log-bin = mysql-bin # 可選:binlog_format = ROW server-id = 1 # 重啟後驗證 mysql> SHOW VARIABLES LIKE 'log_bin'; -- ON mysql> SHOW MASTER STATUS; -- 確認當前 Binlog 文件與位點
--start-date/--stop-date)或位點范圍(--start-position/--stop-position)提取。mysql 客戶端重放。mysqldump --master-data=2 記錄備份瞬間 Binlog 位點。# 1. 恢復昨晚全量備份 mysql -u root -p < /backup/full_20240114_2300.sql # 2. 重放 Binlog 從備份位點 到 10:00 前一秒 mysqlbinlog --stop-datetime="2024-01-15 09:59:59" \ /var/lib/mysql/mysql-bin.000123 | mysql -u root -p # 3. (若誤操作後仍有正常業務)重放 10:01 之後 mysqlbinlog --start-datetime="2024-01-15 10:01:00" \ /var/lib/mysql/mysql-bin.000123 | mysql -u root -p
mysqlbinlog --start-datetime="2024-01-15 09:55:00" --stop-datetime="2024-01-15 10:05:00" \ /var/lib/mysql/mysql-bin.000123 > /tmp/review.sql
用編輯器搜索誤操作 SQL(如 DROP TABLE, DELETE FROM),記錄其 # at position 前後位點。
# 恢復到誤操作前位點 368312 mysqlbinlog --stop-position=368312 /var/lib/mysql/mysql-bin.000123 | mysql -u root -p # 跳過誤操作,從 368315 繼續重放至最新 mysqlbinlog --start-position=368315 /var/lib/mysql/mysql-bin.000123 | mysql -u root -p
| 參數 | 說明 |
|---|---|
| --start-datetime / --stop-datetime | 格式 "YYYY-MM-DD HH:MM:SS",按時間過濾 |
| --start-position / --stop-position | 按 Binlog 內部位點過濾,精確到事件 |
| --database / -d | 只解析指定庫(需 Row 格式或 Statement 含 USE db) |
| --verbose / -v | Row 格式顯示為可讀 SQL(含列值) |
| --base64-output=DECODE-ROWS | 配合 -v 解碼 Row 事件 |
expire_logs_days = 7 或手動 PURGE BINARY LOGS TO 'mysql-bin.000xxx'。binlog_format = ROW,便於 mysqlbinlog -v 還原真實數據,且復制更安全。gtid_mode=ON,恢復時用 SET GTID_PURGED 替代位點管理,更簡單可靠。max_allowed_packet 需足夠大(mysql --max-allowed-packet=256M)。ALTER TABLE)會隱式提交,位點劃分需謹慎。