sql操作删除掉的数据如何恢复 MySQL 实战案例 ——模拟 误删数据,然后用 binlog 回放恢复 的完整流程
·
目录
🛠️ MySQL 误删数据恢复实战案例
📌 前置条件
-
使用 MySQL InnoDB 引擎
-
已开启 binlog(二进制日志)
检查是否开启 binlog:
SHOW VARIABLES LIKE 'log_bin';
如果返回 ON,说明开启了。
1️⃣ 准备测试表与数据
-- 创建测试库
CREATE DATABASE test_recover;
USE test_recover;
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
-- 插入一些测试数据
INSERT INTO users (name, age) VALUES
('Alice', 22),
('Bob', 25),
('Charlie', 30),
('David', 28),
('Eva', 35);
-- 查看数据
SELECT * FROM users;
📌 此时 users 表里有 5 条数据。
2️⃣ 模拟误删操作
-- 手抖误删了 Bob
DELETE FROM users WHERE name = 'Bob';
-- 查看数据
SELECT * FROM users;
👉 Bob 已经不见了。
3️⃣ 假设我们已经提交(无法直接 rollback)
我们要从 binlog 中恢复。
4️⃣ 找到对应的 binlog 文件
执行:
SHOW BINARY LOGS;
会显示类似:
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| mysql-bin.000001 | 154 |
| mysql-bin.000002 | 234 |
+-------------------+-----------+
记录了执行过的所有 SQL。
5️⃣ 查看 binlog 内容
使用 mysqlbinlog 工具(在 MySQL 安装目录里)。
例如:
mysqlbinlog --no-defaults --start-datetime="2025-08-18 00:00:00" \
--stop-datetime="2025-08-18 23:59:59" \
/var/lib/mysql/mysql-bin.000002 > binlog.sql
📌 参数说明:
-
--start-datetime和--stop-datetime:指定要恢复的时间范围(避免全量恢复,减少风险) -
/var/lib/mysql/mysql-bin.000002:binlog 文件路径 -
> binlog.sql:导出到一个 SQL 文件
6️⃣ 找到误删的 SQL
打开 binlog.sql,你会看到类似:
### DELETE FROM `test_recover`.`users`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='Bob' /* VARSTRING(50) meta=50 nullable=1 is_null=0 */
### @3=25 /* INT meta=0 nullable=1 is_null=0 */
说明我们删掉了 id=2, name='Bob', age=25 这一行。
7️⃣ 恢复数据
有两种方式:
✅ 方式一:手动 INSERT
INSERT INTO users (id, name, age) VALUES (2, 'Bob', 25);
✅ 方式二:直接回放 binlog 到误删前
如果你要恢复整个库到某个时间点,可以执行:
mysqlbinlog --no-defaults --start-datetime="2025-08-18 00:00:00" \
--stop-datetime="2025-08-18 15:30:00" \
/var/lib/mysql/mysql-bin.000002 | mysql -u root -p
📌 这样会把误删前的 SQL 全部执行,恢复到某个时间点。
8️⃣ 验证数据恢复
SELECT * FROM users;
👉 Bob 已经回来了。
✅ 总结
-
DELETE 误删 → 可用 binlog 恢复
-
流程:误删 → 找 binlog → 导出 SQL → 定位误删 → 回放或手动恢复
-
前提:必须提前开启 binlog + 定期备份
删库很危险,跑路要尽快🤪🤪🤪
更多推荐



所有评论(0)