一. 简介
背景
:由于运维、开发误操作或是业务bug,我们在操作中时不时会出现误删除数据情况。早期要想恢复数据,只能让业务人员根据线上操作日志,构造误删除的数据,或者DBA使用binlog和备份的方式恢复数据,不管那种,都非常费时费力,而且容易出错。
MyFlash
是由美团点评公司技术工程部开发维护的一个回滚DML操作的工具。该工具通过解析v4版本的binlog,完成回滚操作。相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易。
二. 恢复工具对比
1.mysqlbinlog工具配合sed、awk
。该方式先将binlog解析成类SQL的文本,然后使用sed、awk把类SQL文本转换成真正的SQL。
- 优点:当SQL中字段类型比较简单时,可以快速生成需要的SQL,且编程门槛也比较低。
- 缺点:当SQL中字段类型比较复杂时,尤其是字段中的文本包含HTML代码,用awk、sed等工具时,就需要考虑极其复杂的转义等情况,出错概率很大。
2.给数据库源码打patch。该方式扩展了mysqlbinlog的功能,增加Flashback选项
。
- 优点:复用了MySQL Server层中binlog解析等代码,一旦稳定之后,无须关心复杂的字段类型,且效率较高。
- 缺点:在修改前,需要对MySQL的复制代码结构和细节需要较深的了解。版本比较敏感,在MySQL 5.6上做的patch,基本不能用于MySQL 5.7的回滚操作。升级困难,因为patch的代码是分布在MySQL的各个文件和函数中,一旦MySQL代码改变,特别是复制层的重构,升级的难度不亚于完全重新写一个。
3.使用业界提供的解析binlog的库,然后进行SQL构造,其优秀代表是binlog2sql
。
- 优点:使用业界成熟的库,因此稳定性较好,且上手难度较低。
- 缺点:效率往往较低,且实现上受制于binlog库提供的功能。
4.MyFlash
特点
无需把binlog解析成文本,再进行转换
。提供原生的基于库、表、SQL类型、位置、时间等多种过滤方式
。- 支持MySQL多个版本(5.6与5.7)
- 对于数据库的代码重构不敏感,利于升级。
- 自主掌控binlog解析,提供尽可能灵活的方式。
三. MyFlash 安装
- 解压
unzip MyFlash-master.zip
- 动态编译
gcc -w pkg-config --cflags --libs glib-2.0 source/binlogParseGlib.c -o binary/flashback
四. MyFlash 使用
4.1. 参数
全部参数请通过--help查看,以下指列举部分常用参数。
- databaseNames
- 指定需要回滚的数据库名。多个数据库可以用“,”隔开。如果不指定该参数,相当于指定了所有数据库。
- tableNames
- 指定需要回滚的表名。多个表可以用“,”隔开。如果不指定该参数,相当于指定了所有表。
- start-datetime
- 指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
- stop-datetime
- 指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
- sqlTypes
- 指定需要回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用“,”隔开。
- binlogFileNames
- 指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持。
- outBinlogFileNameBase
- 指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback。
4.2. 示例
回滚bin.000009中,所有与Messages_Center 表上delete操作有关的SQL,时间为‘2018-04-17 15:00:00‘ 之后。
1.过滤并重新生成回滚二进制日志
./flashback --databaseNames stdzwfw9release --tableNames Messages_Center --start-datetime 2018-04-17 15:00:00 --sqlTypes DELETE --binlogFileName bin.000009
2.应用生成的回滚日志
mysqlbinlog binlog_output_base.flashback | mysql -h<host> -u<user> -p
五. 个人总结
MySQL下的误删除恢复经常会碰到,之前我们的普遍做法都是通过mysqlbinlog flashback参数来生成回滚数据,但是有些时候会比较麻烦,因为无法只选择某一类操作,所以会导致恢复的数据会涵盖其他类型的操作,需要人工再次过滤,比较费时费力。
MyFlash的参数可以选择dml操作,那么恢复起来就简单许多,指定恢复的binlog,DML操作,恢复的时间段,即可生成数据,进行回滚。
附录
https://github.com/Meituan-Dianping/MyFlash
原文地址:https://www.cnblogs.com/xuty/p/9046440.html