MySQL 備份系列完結篇:完全備份 + 二進制日誌實現時間點恢復 (PITR)。實戰模擬凌晨備份 → 業務寫入 → 故障 → 完全備份恢復 → Binlog 精確時間點前滾恢復全流程。
完全備份 (基準點) + Binlog (增量變更) = 任意時間點恢復能力

mysql> USE larrydb; mysql> SELECT * FROM class; -- 2 rows mysql> SELECT * FROM stu; -- 2 rows
mysqldump -uroot -p123456 --databases larrydb > larrydb.sql
mysql> RESET MASTER; -- 僅保留 mysql-bin.000001
INSERT INTO class VALUES (3, 'Devel'); UPDATE class SET cname='dab' WHERE cid=2; DELETE FROM stu WHERE cid=2; UPDATE stu SET sname='larry007' WHERE sid=1; -- 時間: 19:37:45 提交
rm -rf /usr/local/mysql/data/larrydb/ mysql> DROP DATABASE larrydb;
mysql -uroot -p123456 < larrydb.sql -- 驗證: 恢復至備份時刻狀態 (2 rows each)
# 方案 A: 指定停止時間 (精確到秒) mysqlbinlog --stop-datetime "2013-09-10 19:37:45" mysql-bin.000001 | mysql -uroot -p123456 -- 結果: 恢復至 19:37:45 前 (stu=1 row, class=3 rows) mysqlbinlog --stop-datetime "2013-09-10 19:37:46" mysql-bin.000001 | mysql -uroot -p123456 -- 結果: 包含 19:37:45 提交事務 (stu=larry007, class=3 rows) # 方案 B: 指定位置點 (更精確) mysqlbinlog --stop-position=7240 mysql-bin.000001 | mysql -uroot -p123456
恢復時間點 = 故障發生時間 + 1 秒 (確保包含故障前最後提交的事務)
[mysqld] log-bin = mysql-bin expire_logs_days = 7 max_binlog_size = 512M sync_binlog = 1 # 金融業務建議 binlog_format = ROW # 最安全格式