目录

🛠️ MySQL 误删数据恢复实战案例

📌 前置条件

1️⃣ 准备测试表与数据

2️⃣ 模拟误删操作

3️⃣ 假设我们已经提交(无法直接 rollback)

4️⃣ 找到对应的 binlog 文件

5️⃣ 查看 binlog 内容

6️⃣ 找到误删的 SQL

7️⃣ 恢复数据

✅ 方式一:手动 INSERT

✅ 方式二:直接回放 binlog 到误删前

8️⃣ 验证数据恢复

✅ 总结

删库很危险,跑路要尽快🤪🤪🤪


🛠️ 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 已经回来了。


✅ 总结

  1. DELETE 误删 → 可用 binlog 恢复

  2. 流程:误删 → 找 binlog → 导出 SQL → 定位误删 → 回放或手动恢复

  3. 前提:必须提前开启 binlog + 定期备份

删库很危险,跑路要尽快🤪🤪🤪

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐