前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DML 误操作?MySQL 闪回工具大盘点

DML 误操作?MySQL 闪回工具大盘点

作者头像
爱可生开源社区
发布于 2025-04-09 08:24:36
发布于 2025-04-09 08:24:36
14700
代码可运行
举报
运行总次数:0
代码可运行

作者:雷文霆,爱可生华东交付服务部 DBA 成员,主要负责 MySQL 故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。


操作数据库时,如果不慎执行了 DML 误操作,闪回工具可以回滚这类 DML 误操作。

闪回之前

在使用闪回工具之前,需要明确几个小问题:

哪些 SQL 类型可以使用闪回工具?

可以使用闪回工具回滚的 DML 类型包括:DELETE、INSERT、UPDATE,不支持 DDL。

需要满足哪些条件才能使用?

闪回前还有一些条件,相关参数满足条件(binlog_row_image=fullbinlog_format=row),且误操作 DML 后,表结构没有增删列(因为 binlog 中不含表字段名)。

误操作一定要用工具么?

如果 DML 操作涉及的数据量较小,则推荐直接在应用侧执行闪回语句效率更高,但闪回语句需要经过应用侧确认之后,在应用层执行。

有哪些闪回工具推荐?

目前比较主流的 MySQL 闪回工具有 binlog2sql[1]my2sql[2]MyFlash[3] 三款。

基本信息

binlog2sql

my2sql

MyFlash

MySQL支持版本

5.7

5.7 / 8.0

5.7

离线解析

语言

Python

Go

C

最后更新时间

2018.10

2022.11

2020.11

功能特点

binlog2sql:回滚 DML,解析出回滚或原始 SQL。

my2sql:回滚 DML,解析出回滚或原始 SQL。还可以通过 binlog 统计 DML、长事务与大事务分析。

MyFlash:回滚 DML,生成 binlog 类型的回滚文件。

综合以上,推荐使用 my2sql 回滚 DML。下面我们着重介绍 MyFlash 和 my2sql 两款工具的使用。

MyFlash

MyFlash 是由美团点评公司技术工程部开发维护的一个回滚 DML 操作的工具。该工具通过解析 v4 版本的 binlog,完成回滚操作。相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易。该工具已经在美团点评内部使用。

MyFlash 可以完全离线,因为只是生成回滚 binlog 文件。但只支持单个文件解析。

推荐方式:指定 GTID 范围,等同于时间点和 Pos 点。

使用方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show master status\G
File: mysql-bin.000014
Executed_Gtid_Set: 52875cf3-e9d3-11ef-88ab-02000aba3d09:120764

checksum table test_table;
+-------------------+------------+
| Table             | Checksum   |
+-------------------+------------+
| test01.test_table | 1479091061 |
+-------------------+------------+

模拟误操作,事务号范围 120765-120766。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
update test_table set blob_field='Tom' where id <900;
update test_table set blob_field='Jreey' where id >900 and id<1000;

执行回滚,有事务号使用 --include-gtids。默认生成的回滚文件名为:binlog_output_base.flashback

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cd  MyFlash-master/binary/
./flashback --binlogFileNames=mysql-bin.000014 --databaseNames=test01 --tableNames=test_table --sqlTypes='delete,insert,update' --include-gtids='52875cf3-e9d3-11ef-88ab-02000aba3d09:120765-120766'

应用回滚的 binlog 文件,会记录本地 gtid 事务号(skip-gtids不能避免记录事务号,只是为了防止 SQL_MODE=ON 报错)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysqlbinlog -vv binlog_output_base.flashback --skip-gtids|mysql -uroot -p

验证结果一致!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
checksum table test_table;
+-------------------+------------+
| Table             | Checksum   |
+-------------------+------------+
| test01.test_table | 1479091061 |
+-------------------+------------+

⚠️ 注意事项

  1. binlogFileNames 指定需要回滚的 binlog 文件,目前只支持单个文件。
  2. sqlTypes 支持写一个类型,如 --sqlTypes='delete'
  3. include-gtids 指定需要回滚的 gtid,支持 gtid 的单个和范围两种形式。
  4. exclude-gtids 指定不需要回滚的 gtid,用法同 include-gtids

my2sql

my2sql 是 Go 版的 MySQL binlog 解析工具,通过解析 MySQL binlog ,可以生成原始 SQL、回滚 SQL、去除主键的 INSERT SQL 等,也可以生成 DML 统计信息。基于 my2fback、binlog_rollback 工具二次开发而来。2.0 版本开始支持 caching_sha2_password 插件,推荐使用此版本。

my2sql 根据需要原始 SQL 或回滚 SQL,对应 work-type 参数,支持指定时间点(效果等同于 GTID 范围)。

  • 生成原始 SQL:-work-type 2sql
  • 生成回滚 SQL:-work-type rollback

推荐方式:明确指定开始时间和结束时间,配合 file 模式时,只会读取表信息,对库入侵性最小。

核心参数

  • -start-file:指定开始读取的 binlog 文件名称。 虽然也有 -stop-file 参数,指定停止读取的 binlog 文件名称,但一般不用,因为 start-file 配合时间就可以定位出误操作执行的区间。
  • -work-type:工作类型。
    • 2sql:生成原始 SQL。
    • rollback:生成回滚 SQL。
    • stats:只统计 DML、事务信息。
  • -mode:获取 binlog 文件的模式。
    • repl:伪装成从库解析 binlog 文件(需要拉取)(默认)。
    • file:离线解析 binlog 文件。推荐使用,因为以下信息可以证明 file 模式只是查看了表信息。
不同模式连接数据库后的操作信息
unsetunsetrepl 模式unsetunset
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
admin@127.0.0.1 on  using TCP/IP
SET NAMES utf8mb4
SET autocommit=true
admin@127.0.0.1 on  using TCP/IP
SHOW GLOBAL VARIABLES LIKE 'BINLOG_CHECKSUM'
SET @master_binlog_checksum='NONE'
SET @slave_uuid = 'ff2f78c5-fb2c-11ef-a0eb-02000aba3d09', @replica_uuid = 'ff2f78c5-fb2c-11ef-a0eb-02000aba3d09'
 Binlog Dump       Log: 'mysql-bin.000004'  Pos: 4
Query     SHOW COLUMNS FROM `test01`.`t01`
Query     SHOW INDEX FROM `test01`.`t01`
unsetunsetfile 模式unsetunset
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
admin@127.0.0.1 on  using TCP/IP
SET NAMES utf8mb4
SET autocommit=true
SHOW COLUMNS FROM `test01`.`t01`
SHOW INDEX FROM `test01`.`t01`
  • -local-binlog-file:binlog 文件路径。 当指定 -mode file 参数时,需要指定 -local-binlog-file binlog 文件的相对路径或绝对路径,可以连续解析多个 binlog 文件,只需要指定起始文件名,工具会自动持续解析下个文件。

下面我们将先后介绍 生成回滚 SQL 和原始 SQL 两种工作类型。

生成回滚 SQL

生成的 SQL 文件,导入会更新 GTID。

⚠️ 注意事项 可使用 set+source 避免更新 GTID。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show masterstatus\G
File: mysql-bin.000006
Position: 255561
52875cf3-e9d3-11ef-88ab-02000aba3d09:1-34

selectcount(*) from t01;checksumtable t01;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
+------------+------------+
| Table      | Checksum   |
+------------+------------+
| test01.t01 | 1658863531 |
+------------+------------+

模拟数据误操作 DELETE,删除了 499 行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete from t01 where id < 500;

找到误删除的开始的时间,如 250307 14:12:06,根据误操作时间定位到 binlog 文件,直接搜索 🔍 误操作的语句也可以。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysqlbinlog --base64-output=decode-rows -vv --database test01 mysql-bin.000006 |grep  -C 10 -i "Rows_query" |grep -C 10    -i "t01" |grep -C 10 -i "delete" > t01_detele.log
#250307 14:12:06 server id 110  end_log_pos 255759      Rows_query
# delete from t01 where id < 500

结束的时间,如 250307 14:38:11(需要找到下一个事务的开始时间),往下搜索 🔍 COMMIT 或是 SESSION.GTID_NEXT 或是 GTID 信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#250307 14:12:06 server id 110  end_log_pos 265277      Xid = 445
COMMIT/*!*/;
# at 265277
#250307 14:38:11 server id 110  end_log_pos 265350

以下方案二选一。

方案一

直接读取 binlog 文件解析时(-mode file),binlog 文件相对路径或绝对路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./my2sql -user admin -password 123456 -host 127.0.0.1  -port 3313 -mode file -local-binlog-file ./mysql-bin.000004  -work-type rollback  -start-file mysql-bin.000004 -start-datetime "2025-03-07 14:12:06" -stop-datetime "2025-03-07 14:38:11" -add-extraInfo -output-dir ./tmpdir
方案二

伪装成从库解析 binlog。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./my2sql -user admin -password 123456 -host 127.0.0.1  -port 3313  -work-type rollback  -start-file mysql-bin.000004 -start-datetime "2025-03-07 14:12:06" -stop-datetime "2025-03-07 14:38:11" -add-extraInfo -output-dir ./tmpdir01

两种方案执行结果一样,共生成了 3 个文件。

  • rollback.6.sql:回滚 SQL 文件
  • biglong_trx.txt:大事务信息
  • binlog_status.txt:DML 的统计信息

验证与误删除数据量是否相等。导入验证结果一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat rollback.6.sql |grep "INSERT INTO"|wc -l
499

重定向方式 < 导入,会记录到 binlog 并增加事务号。可通过 set sql_log_bin=0; source 的方式不记录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set sql_log_bin=0;
source /tools/my2sql_test/tmpdir/rollback.6.sql;
select count(*) from t01;checksum table t01;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
+------------+------------+
| Table      | Checksum   |
+------------+------------+
| test01.t01 | 1658863531 |
+------------+------------+

⚠️ 注意事项

  1. mysqlbinlog 命令解析参数 base64-output=decode-rows (可选),作用是将二进制日志中以 Base64 编码存储的行数据解码为可读的文本格式。这样,你在查看二进制日志内容时,就可以直接看到具体的行数据更改,而不是一串 Base64 编码的字符串。
  2. 闪回 SQL 文件中的 # datetime=... 这行的内容,就是加了参数 -add-extrainfo 后加入的附加信息,可以获取每个语句执行的具体时间和点位。
  3. my2sql 工具可以增加 -databases 参数,实现只过滤指定库,默认为全部库。

生成原始 SQL

除了参数 work-type=2sql,其他参数和生成回滚 SQL 命令一样。

方案一

直接读取 binlog 文件解析。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./my2sql -user admin -password 123456 -host 127.0.0.1  -port 3313 -mode file -local-binlog-file ./mysql-bin.000004  -work-type 2sql  -start-file mysql-bin.000004 -start-datetime "2025-03-07 14:12:06" -stop-datetime "2025-03-07 14:38:11" -add-extraInfo -output-dir ./tmpdir
方案二

伪装成从库解析 binlog。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./my2sql -user admin -password 123456 -host 127.0.0.1  -port 3313  -work-type 2sql  -start-file mysql-bin.000004 -start-datetime "2025-03-07 14:12:06" -stop-datetime "2025-03-07 14:38:11" --add-extraInfo -output-dir ./tmpdir01

两种方案执行结果一样,共生成了 3 个文件。

  • forward.6.sql:原始 SQL 文件(原始误操作语句)
  • biglong_trx.txt:大事务信息
  • binlog_status.txt:DML 的统计信息

查看生成的 biglong_trx.txt 文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat biglong_trx.txt 
binlog            starttime           stoptime            startpos   stoppos    rows     duration   tables
mysql-bin.000006  2025-03-07_14:12:06 2025-03-07_14:12:06 255636     265277     499      0     [test01.t01(inserts=0, updates=0, deletes=499)]

查看生成的 binlog_status.txt 文件,会统计每个时间段区间内相关库表所产生的 DML 次数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat binlog_status.txt 
binlog            starttime           stoptime            startpos   stoppos    inserts  updates  deletes  database        table               
mysql-bin.000006  2025-03-07_14:12:06 2025-03-07_14:12:06 255759     265250     0        0        499      test01          t01                 

🤔 思考:如何避免误操作?

使用闪回工具只是一种补救措施,安全运维应该在预防误操作上有哪些安排呢?

一个让运维人员睡的安心的数据保障系统(MySQL 版)。

  1. 预防,为了减少数据误删除发生的概率,通过交付基线避免。
  2. 技术回归(时间点恢复 Point-in-Time Recovery)删库删表,万一发生误操作,通过备份和 binlog 回放恢复。
  3. 技术回归(闪回工具)回滚 DML,通过 binlog 恢复。
  4. 技术回归(Undrop-for-innodb) 磁盘文件级别恢复(虽然有些缺陷)。

预防问题发生,然后解决发生的问题,提高运维服务的满意度~

参考资料

[1]

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

[2]

my2sql: https://github.com/liuhr/my2sql

[3]

MyFlash: https://github.com/Meituan-Dianping/MyFlash

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱可生开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【DB宝43】MySQL误操作闪回恢复利器之my2sql
可以用于MySQL误操作闪回的工具包括my2sql、binlog2sql和MyFlash等工具,其中,个人感觉my2sql最好用。
AiDBA宝典
2021/03/15
1.4K0
【DB宝43】MySQL误操作闪回恢复利器之my2sql
使用my2sql来恢复mysql数据
使用说明来源原作者:my2sql的GitHub地址:https://github.com/liuhr/my2sql
wangwei-dba
2021/05/20
2K0
my2sql数据闪回
用户3202196
2024/10/24
1330
my2sql简介
前几天,有开发误操作,要求恢复数据,用my2sql rollback模式抢救回来。今天介绍一下该工具,并做个总结,后续有时间看看该工具的代码实现。
DBA札记
2023/08/04
6170
my2sql简介
【MySQL】删库别着急跑路(三)--binlog2sql闪回工具的使用
再说binlog2sql闪回工具之前,我们先聊下binlog。Binlog记录了MySQL数据库所有的DDL和DML操作。它在MySQL数据库里起着至关重要的作用。
MySQL数据库技术栈
2020/08/05
6760
【MySQL】删库别着急跑路(三)--binlog2sql闪回工具的使用
my2sql 闪回操作流程
go版MySQL binlog解析工具,通过解析MySQL binlog ,可以生成原始SQL、回滚SQL、去除主键的INSERT SQL等,也可以生成DML统计信息。
你要的小米吖
2021/08/19
9440
my2sql 闪回操作流程
技术分享 | binlog 实用解析工具 my2sql
爱可生 MySQL DBA 团队成员,Oracle 10g OCM,MySQL 5.7 OCP,擅长数据库性能问题诊断、事务与锁问题的分析等,负责处理客户 MySQL 及我司自研 DMP 平台日常运维中的问题,对开源数据库相关技术非常感兴趣。
爱可生开源社区
2021/01/13
1.4K0
技术分享 | MySQL 闪回工具 MyFlash
MyFlash 是美团点评开源的一个 MySQL 闪回工具,可以用来回滚 MySQL 中的 DML 操作,恢复到某时刻的数据。本文将简单地介绍 MySQL 闪回工具 MyFlash 的使用。
爱可生开源社区
2020/12/30
1.3K0
技术分享 | my2sql 接入 DBeaver 案例分享
本文分享下对于 my2sql 的一些改进,并且接入到 DBeaver 中供开发便捷使用的一个实际案例。
爱可生开源社区
2022/02/09
6680
技术分享 | my2sql 接入 DBeaver 案例分享
【MySQL】数据库闪回工具之binlo
[root@wallet01 ~]# tar zxvf Python-3.6.1.tgz [root@wallet01 ~]# cd Python-3.6.1 [root@wallet01 Python-3.6.1]# ./configure --prefix=/usr/local/python3 [root@wallet01 Python-3.6.1]# make && make install [root@wallet01 ~]# rm -rf /usr/bin/python [root@wallet0
py3study
2020/01/14
9180
my2sql工具之快速入门
my2sql除了可以用来做binlog的解析、闪回,还提供主从切换后新master丢数据的修复、大事务和长事务的分析、主从延迟分析等,后面有空继续分享my2sql在事务方面的应用,大家也可以自己动手实践一下。
GreatSQL社区
2023/02/23
8930
技术分享 | my2sql 与 binlog2sql 解析效率 battle
大家在平时运维过程中应该都了解过或者使用过一些 binlog 解析工具,比如今天要介绍的 my2sql 和 binlog2sql 。my2sql 是基于 my2fback 、binlog_rollback 工具二次开发而来的(go语言),binlog2sql 是 python 语言开发的 mysql binlog 解析工具,两者都可以通过解析 binlog 文件,生成原始 SQL ,回滚SQL ,去除主键的 insert sql 等,然后实现数据快速闪回,主从切换后的数据补偿等功能。
爱可生开源社区
2022/08/30
5750
删库不跑路!我含泪写下了 MySQL 数据恢复大法…
点击关注公众号,Java干货及时送达 作者:程淇铭 来源:segmentfault.com/a/1190000020116271 日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。 相关文章 MySQL备份策略:https://segmentfault.com/a/1190000019955399 MySQL数据恢复:https://segmentfault.com/a/1190000020116271 1 前言 数据恢
Java技术栈
2022/03/18
6730
删库不跑路:论MySQL数据恢复
日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。
JavaFish
2020/07/21
1.6K0
使用binlog2sql恢复数据
在MySQL里面,如果我们有延迟从库的话,也可以找回之前的数据,但是有时候不太好使(因为追数据到误操作前的准确的时间点有时候也不太好把握)。
保持热爱奔赴山海
2019/12/24
5850
恢复误操作的方法
前一段时间接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响。大多数情况是开发误操作delete数据,update多数行,根据之前的操作经验,本文介绍常用的恢复方法。
用户1278550
2018/08/09
8390
技术分享 | 如何通过 binlog 定位大事务?
作者:李彬,爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。爱好有亿点点多,吉他、旅行、打游戏…
爱可生开源社区
2024/03/07
7090
技术分享 | 如何通过 binlog 定位大事务?
[MYSQL案例][006] 无备份恢复数据
一般的做法是找到3天前的备份, 做全备恢复, 然后跑binlog跑到指定时间点即可.
大大刺猬
2023/05/24
3750
【MySQL】Mysql误操作后使用binlog2sql快速回滚
DML(data manipulation language): 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
用户5522200
2019/06/02
1.7K0
[MYSQL] 几款免费的mysql binlog回滚工具的使用比较
在mysql日常运维中, 难免遇到需要回滚binlog的时候, 市面上能回滚binlog的工具还挺多的, 但都各种小问题, 今天我就来简单测评一下. 从使用难易度, 兼容性(主要测试5.7, 8.0, 8.4), 流行度, 最近一次维护时间等方面进行综合评价.
大大刺猬
2025/03/13
4030
相关推荐
【DB宝43】MySQL误操作闪回恢复利器之my2sql
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验