MySQL Binlog 数据误删除恢复完全指南

1. 背景

生产环境中常见事故:

  • DELETE误执行
  • TRUNCATE误操作
  • 用户权限表被清空
  • 操作日志被删除
  • 批量 UPDATE错误

例如:

复制代码
DELETE FROM sys_user;

DELETE FROM sys_oper_log;

如果没有备份,如何恢复?

MySQL提供的 binlog 可以记录所有数据库变化,通过解析 binlog 可以实现数据恢复。


2. Binlog恢复原理

2.1 Binlog是什么?

MySQL binlog:

Binary Log(二进制日志)

记录:

  • INSERT
  • UPDATE
  • DELETE
  • DDL

例如:

执行:

复制代码
DELETE FROM sys_user WHERE id=1;

binlog记录:

复制代码
删除了一条记录
原始数据:
id=1
username=test

恢复:

反向生成:

复制代码
INSERT INTO sys_user VALUES(...);

2.2 Binlog不是回收站

区别:

回收站

复制代码
删除文件

↓

保存完整文件

↓

恢复

Binlog

复制代码
记录操作过程

↓

需要反向执行

所以:

binlog恢复 = 反向重放操作。


3. 恢复前检查

3.1 确认binlog开启

进入MySQL:

复制代码
SHOW VARIABLES LIKE 'log_bin';

结果:

复制代码
ON

3.2 查看binlog列表

不要直接猜文件。

执行:

复制代码
SHOW BINARY LOGS;

例如:

复制代码
binlog.000164
binlog.000165
binlog.000166

3.3 查看当前binlog

复制代码
SHOW MASTER STATUS;

例如:

复制代码
File:
binlog.000167

Position:
39521277

4. 安装binlog2sql

4.1 安装依赖

Ubuntu:

复制代码
apt update

apt install python3 python3-venv git -y

4.2 下载binlog2sql

复制代码
cd /opt

git clone https://github.com/danfengcao/binlog2sql.git

进入:

复制代码
cd binlog2sql

4.3 创建虚拟环境

复制代码
python3 -m venv venv

进入:

复制代码
source venv/bin/activate

4.4 安装依赖

复制代码
pip install -r requirements.txt

如果:

复制代码
pymysqlreplication

异常:

安装:

复制代码
pip install mysql-replication

5. 定位事故时间

例如:

发现:

复制代码
2026-08-12 01:24

误删除。

不要直接:

错误:

复制代码
mysqlbinlog binlog.000166

因为不知道文件。

应该:

根据:

复制代码
SHOW BINARY LOGS;

判断。


6. 使用mysqlbinlog查看原始数据

6.1 普通查看

复制代码
mysqlbinlog binlog.000166

只能看到:

复制代码
Delete_rows
Update_rows

6.2 推荐:-vvv详细解析

注意:

必须:

复制代码
--no-defaults

否则可能报:

复制代码
unknown variable 'default-character-set=utf8mb4'

执行:

复制代码
mysqlbinlog \
--no-defaults \
-vvv \
--start-datetime="2026-08-12 01:00:00" \
--stop-datetime="2026-08-12 08:00:00" \
binlog.000166 \
> /tmp/binlog.sql

输出:

复制代码
### DELETE FROM sys_oper_log

### WHERE

@1=123
@2='000000'
@3='登录日志'

7. binlog2sql恢复

DELETE恢复

原:

复制代码
DELETE FROM sys_oper_log

恢复:

复制代码
INSERT INTO sys_oper_log

执行:

复制代码
python binlog2sql.py \
-h 127.0.0.1 \
-u root \
-p 'password' \
-d rene-ems \
-t sys_oper_log \
--start-file binlog.000166 \
--start-datetime "2026-08-12 01:00:00" \
--stop-datetime "2026-08-12 02:00:00" \
-B \
> restore.sql

8. 注意:binlog2sql不是绝对可靠

实际生产遇到:

问题1:字段错位

例如:

错误:

复制代码
create_time='Gazquez Energy'

原因:

binlog2sql解析:

复制代码
@1
@2
@3

但是当前表结构:

已经变化。


解决:

使用:

复制代码
mysqlbinlog -vvv

确认:

真实字段:

复制代码
@1=user_id
@2=tenant_id
@3=dept_id

然后生成恢复SQL。


9. 通用恢复方式(推荐)

不要针对某个表写脚本。

应该做通用恢复工具:

输入:

复制代码
binlog文件

时间范围

数据库

表名

自动:

复制代码
mysqlbinlog -vvv

↓

解析DELETE_ROWS

↓

读取表结构

↓

@1映射字段

↓

生成INSERT

支持:

DELETE

恢复:

复制代码
DELETE
↓
INSERT

UPDATE

恢复:

复制代码
UPDATE old

↓

UPDATE new

INSERT

恢复:

复制代码
INSERT

↓

DELETE

10. 恢复前必须备份

不要直接恢复生产。

执行:

复制代码
mysqldump \
-uroot \
-p \
rene-ems \
> before_restore.sql

11. 恢复流程标准化

生产事故:

复制代码
发现误操作

↓

记录时间

↓

停止写入

↓

SHOW BINARY LOGS

↓

确定binlog文件

↓

mysqlbinlog -vvv分析

↓

确认影响表

↓

生成恢复SQL

↓

测试库验证

↓

生产恢复

12. 生产环境最佳实践

不要只依赖binlog。

建议:

每日全备

例如:

复制代码
02:00
mysqldump / xtrabackup

binlog保留

例如:

复制代码
30天

延迟从库

例如:

复制代码
主库
 |
 |
延迟1小时从库

误删:

直接从延迟库恢复。


总结

这次事故最大的经验:

  1. binlog不是回收站,是操作录像
  2. binlog2sql不是100%可靠,需要验证字段映射
  3. mysqlbinlog -vvv 是最终可信来源
  4. 恢复前必须确认表结构
  5. 生产环境应该使用全备 + binlog + PITR方案
相关推荐
oradh1 小时前
Oracle ADRCI 诊断数据工具总结
数据库·oracle·adrci
zzzll11111 小时前
Loop Engineering:循环工程的原理、实践与应用
java·数据库·python
IpdataCloud1 小时前
IPv6查出来的地理位置是错的?技术解析与双栈定位方案
数据库·tcp/ip·ip
数字新视界2 小时前
信创动环监控厂家深入剖析智能机房环境监控技术应用与挑战
服务器·数据库·物联网·芯片·动环监控系统
羑悻的小杀马特2 小时前
打破深海垄断:国产数据库如何托起固井软件的“数据心脏”?
数据库
今天AI了吗2 小时前
从 LLM 到 Agent Skill:把 AI 底层概念串起来
数据库·人工智能·sql·深度学习·神经网络·算法·机器学习
2401_894915532 小时前
新手落地 Geo 优化:源码下载、依赖安装、数据库初始化完整步骤
运维·服务器·数据库·人工智能·缓存·开源
陈卿诺语2 小时前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
sql·mysql·adb
南城以南溫暖如初1472 小时前
社区健身小程序开发流程详解:技术选型与实施经验分享
java·经验分享·spring boot·mysql·vue·apache