🌲 总入口:你想恢复什么?
恢复类型
├── 表结构 + 表数据(整张表被 DROP)
│ ├── Binlog 中包含 CREATE TABLE
│ │ └── ✅ 直接用 mysqlbinlog 提取建表 + 数据语句,回放即可
│ └── Binlog 中没有 CREATE TABLE
│ └── ⚠️ 需你手动重建表结构 → 再回放 binlog 数据
│
├── 只恢复数据(数据被 DELETE / UPDATE)
│ ├── Binlog 格式为 ROW
│ │ └── ✅ 可通过 mysqlbinlog --verbose 恢复数据内容
│ └── Binlog 格式为 STATEMENT
│ └── ✅ 可直接看到 SQL,但不记录数据值(不适合误删场景)
│
├── 恢复到某个“时间点之前”的全库状态(误操作回滚)
│ ├── 有全量备份 + binlog
│ │ └── ✅ 使用 mysqldump + mysqlbinlog --stop-datetime 还原
│ └── 无全量备份
│ └── ⚠️ 只能部分恢复(依赖 binlog 中是否记录了完整建表 + 数据)
✅ 各类场景对应操作
✅ 场景一:误删整张表(DROP TABLE)
条件 |
操作 |
binlog 有 CREATE TABLE |
提取并执行 mysqlbinlog 输出的 SQL |
binlog 无 CREATE TABLE |
手动恢复表结构 → 回放 binlog 插入记录 |
时间点明确 |
使用 --stop-datetime 防止重复 DROP |
不确定 DROP 时间 |
手动编辑恢复 SQL,删除 DROP 段 |
✅ 场景二:误删数据(DELETE)或误改(UPDATE)
类型 |
恢复方法 |
DELETE |
binlog 中 WHERE 提供旧值 → 构造 INSERT |
UPDATE |
binlog 中包含旧值和新值 → 可重做或回滚 |
INSERT |
binlog 中记录新值,可直接重放 INSERT |
工具建议 |
使用 mysqlbinlog --verbose 查看字段内容 |
✅ 场景三:全量备份 + binlog 增量恢复(生产推荐)
步骤 |
命令 |
备份(每天) |
mysqldump --all-databases |
误操作发生后恢复备份 |
mysql < full_backup.sql |
提取误操作前的 binlog |
mysqlbinlog --stop-datetime=“误删前” |
重放至误删点止 |
mysql < recovery_binlog.sql |
✅ 辅助命令参考
# 提取 binlog 中某时间段操作
mysqlbinlog --start-datetime="2025-04-09 22:00:00" \
--stop-datetime="2025-04-09 23:00:00" \
/var/lib/mysql/binlog.000010 > /tmp/recovery.sql
# 执行恢复
mysql -uroot -p < /tmp/recovery.sql
✅ 推荐策略小结
推荐措施 |
说明 |
开启 binlog + ROW 格式 |
精确记录每一行变动 |
配置 expire_logs_days |
避免 binlog 被自动清理 |
定期做 mysqldump 结构备份 |
保证建表语句能被恢复 |
关键 binlog 文件定期备份 |
可保留误删后的恢复可能 |
熟悉 mysqlbinlog + grep |
能快速查到需要恢复的数据片段 |
📘 小结一句话:
Binlog 是 MySQL 的“黑匣子”,在误操作发生时是你最后的防线。
只有在“结构+数据+时间点”都被妥善记录的情况下,你才能做到完整恢复。