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方案
相关推荐
Capricorn198819 分钟前
防编造架构实战:对比 Gemini Notebook 解析知芽 Notebook Skill 的工程实现
人工智能·笔记·elasticsearch·架构·知识图谱·论文笔记
雨辰AI19 分钟前
信创数仓分层建模|国产数据库 ODS/DWD/DWS 分层落地规范(金仓 / 达梦 / 高斯适配)
数据库·云原生·政务
风哥2号1 小时前
MySQL8.x/9.x数据库安装自动化全过程-Fgedu
数据库·mysql自动化安装
玉&心1 小时前
在Kibana查看Elasticsearch中的日志或存储的文档数据
elasticsearch·kibana
疯狂打码的少年1 小时前
【数据库技术】SQL数据查询(SELECT基本语法)
数据库·笔记·sql·oracle
程序员黎剑1 小时前
Redis缓存击穿:热点Key过期打崩数据库的3种解决方案
数据库·redis·缓存
Carl_.Net软开2 小时前
NSSM后台启动influx时序数据库
数据库·时序数据库
IPdodo_2 小时前
静态 IP 访问异常排查:403/429 归因与迁移验收
服务器·网络·数据库·python·网络协议·php·性能测试
DevOpenClub2 小时前
PDF 多格式解析如何避免混用输出:TEXT、HTML、XML 与 TAG 数据契约
xml·前端·数据库·pdf·html
meilindehuzi_a2 小时前
从域名到数据库:React + Node.js 项目部署全流程与用户访问链路
数据库·react.js·node.js