MySql开源闪回工具MyFlash —— 筑梦之路

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

简介

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

前提条件

开启binlog,binlog格式必须为ROW,且binlog_row_image必须为full。

适用于MySQL5.6、5.7,MySQL8.0测试也可以正常使用。

编译安装

bash 复制代码
unzip MyFlash-master.zip
cd MyFlash-master

yum install glib2-devel -y

# 动态编译
gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback

如何使用

bash 复制代码
cd binary

./flashback --help

Usage:
  flashback [OPTION...]

Help Options:
  -?, --help                  Show help options

Application Options:
  --databaseNames             databaseName to apply. if multiple, seperate by comma(,)
  --tableNames                tableName to apply. if multiple, seperate by comma(,)
  --start-position            start position
  --stop-position             stop position
  --start-datetime            start time (format %Y-%m-%d %H:%M:%S)
  --stop-datetime             stop time (format %Y-%m-%d %H:%M:%S)
  --sqlTypes                  sql type to filter . support INSERT, UPDATE ,DELETE. if multiple, seperate by comma(,)
  --maxSplitSize              max file size after split, the uint is M
  --binlogFileNames           binlog files to process. if multiple, seperate by comma(,)
  --outBinlogFileNameBase     output binlog file name base
  --logLevel                  log level, available option is debug,warning,error
  --include-gtids             gtids to process
  --exclude-gtids             gtids to skip

--------------------------------

参数使用说明:
databaseNames
指定需要回滚的数据库名。多个数据库可以用","隔开。如果不指定该参数,相当于指定了所有数据库。
tableNames
指定需要回滚的表名。多个表可以用","隔开。如果不指定该参数,相当于指定了所有表。
start-position
指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚。
stop-position
指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚。
start-datetime
指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。如不指定,则不限定时间。
stop-datetime
指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。如不指定,则不限定时间。
sqlTypes
指定需回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用","隔开。
maxSplitSize
一旦指定该参数,对文件进行固定尺寸的分割(单位为M),过滤条件有效,但不进行回滚操作。该参数主要用来将大的binlog文件切割,防止单次应用的binlog尺寸过大,对线上造成压力。
binlogFileNames
指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持。经测试已支持多个binlog文件。
outBinlogFileNameBase
指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback。
logLevel
仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多。
include-gtids
指定需要回滚的gtid,支持gtid的单个和范围两种形式。
exclude-gtids
指定不需要回滚的gtid,用法同include-gtids。

测试验证

环境说明:mysql 8.0

1. 启用新的binlog文件,并模拟删除数据

bash 复制代码
mysql> select * from test1;
+----+----------+
| id | name |
+----+----------+
|  1 | zhangsan |
| 2 | back |
|  3 | liba |
+----+----------+
3 rows in set (0.03 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.22 sec)

mysql> delete from test1 where id =3;
Query OK, 1 row affected (0.01 sec)

mysql> select * from test1;
+----+----------+
| id | name |
+----+----------+
|  1 | zhangsan |
| 2 | back |
+----+----------+
2 rows in set (0.00 sec)

2. 通过MyFlash解析闪回文件并执行

bash 复制代码
./flashback --databaseNames=testdb --tableNames=test1 --start-datetime='2024-05-10 15:00:00' --stop-datetime='2024-05-10 16:00:00' --binlogFileNames=/home/my3306/log/mysql-bin.000210  --outBinlogFileNameBase=test1back


mysqlbinlog -vv --skip-gtids test1back.flashback |mysql -uroot -p'xxxxxx' -S /home/my3306/run/mysql.sock
mysql: [Warning] Using a password on the command line interface can be insecure.

3. 检查验证

bash 复制代码
mysql> select * from test1;
+----+----------+
| id | name |
+----+----------+
|  1 | zhangsan |
| 2 | back |
|  3 | liba |
+----+----------+
3 rows in set (0.00 sec)

4. 测试恢复执行多个binlog文件

1)每次删除都启用新的binlog文件

bash 复制代码
mysql> select * from test1;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | back |
| 3 | liba |
+----+----------+
3 rows in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.02 sec)

mysql> delete from test1 where id =1;
Query OK, 1 row affected (0.01 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

mysql> delete from test1 where id =2;
Query OK, 1 row affected (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.02 sec)

mysql> delete from test1 where id =3;
Query OK, 1 row affected (0.01 sec)

mysql>
mysql> select * from test1;
Empty set (0.00 sec)

2)通过MyFlash解析多个binlog文件,并一块恢复

bash 复制代码
./flashback --databaseNames=testdb --tableNames=test1 --start-datetime='2023-08-02 15:00:00' --stop-datetime='2023-08-02 16:00:00' --binlogFileNames=/home/my3306/log/mysql-bin.000211,/home/my3306/log/mysql-bin.000212,/home/my3306/log/mysql-bin.000213  --outBinlogFileNameBase=test1back


ls
flashback test1back.flashback test1back.flashback.000001  test1back.flashback.000002


mysqlbinlog -vv --skip-gtids test1back.flashback test1back.flashback.000001 test1back.flashback.000002 |mysql -uroot -p'xxxxxx' -S /home/my3306/run/mysql.sock

mysql: [Warning] Using a password on the command line interface can be insecure.

3)检查验证数据

bash 复制代码
mysql> select * from test1;
+----+----------+
| id | name |
+----+----------+
|  1 | zhangsan |
| 2 | back |
|  3 | liba |
+----+----------+
3 rows in set (0.00 sec)

与同类型工具binlog2sql比较

  • MyFlash工具需要结合mysqlbinlog解析确认需要恢复数据的精确位点,而binlog2sql可以解析为sql语句,更方便确认所需的回滚数据,方便易用。

  • binlog2sql可以生成回滚sql和未回滚sql,MyFlash只能生成回滚binlog,未回滚binlog结合mysqlbinlog解析生成。

  • binlog2sql需要python安装环境,自测mysql8使用过程中因为回滚数据不同,可能出现字符集相关的问题,MyFlash运行比较稳定。

  • 小数据量可以使用binlog2sql进行恢复,大量数据建议使用MyFlash,官方测试100万数据,MyFlash恢复用2.7秒,binlog2sql用581.3秒。

相关推荐
GalaxyPokemon19 分钟前
MySQL基础 [六] - 内置函数+复合查询+表的内连和外连
linux·运维·数据库·mysql·ubuntu
Linux运维老纪1 小时前
Linux 命令清单(Linux Command List)
linux·运维·服务器·数据库·mysql·云计算·运维开发
可观测性用观测云1 小时前
阿里巴巴 Druid 可观测性最佳实践
数据库
代码吐槽菌2 小时前
基于微信小程序的智慧乡村旅游服务平台【附源码】
java·开发语言·数据库·后端·微信小程序·小程序·毕业设计
喝醉酒的小白2 小时前
数据库如何确定或计算 LSN(日志序列号)
数据库
dengjiayue2 小时前
使用 redis 实现消息队列
数据库·redis·缓存
小羊学伽瓦2 小时前
【Redis】——最佳实践
数据库·redis·缓存
biubiubiu07063 小时前
Mysql
数据库·mysql
凌辰揽月3 小时前
眨眼睛查看密码工具类
java·开发语言·数据库
Arbori_262153 小时前
oracle 索引失效
数据库·oracle