MySQL 闪回工具MyFlash

Posted xuty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 闪回工具MyFlash相关的知识,希望对你有一定的参考价值。

一. 简介

背景:由于运维、开发误操作或是业务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 安装

  1. 解压
    unzip MyFlash-master.zip
  2. 动态编译
    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





以上是关于MySQL 闪回工具MyFlash的主要内容,如果未能解决你的问题,请参考以下文章

MyFlash 闪回工具使用

MyFlash 闪回工具使用

MyFlash 闪回工具使用

mysql 误删除

MyFlash 回滚mysql binlog

mysql闪回工具binlog2sql 安装使用