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秒。

相关推荐
曹牧19 小时前
Oracle 大表数据分区存储
数据库·oracle
win x19 小时前
Redis 持久化
数据库·redis·缓存
程序猿202319 小时前
MySQL的锁(行锁)
数据库·mysql
W001hhh19 小时前
数据库实训Day005下午
数据库
lechcat19 小时前
多角色协同巡检流程设计技术教程
大数据·数据库·数据挖掘
小沈同学呀19 小时前
基于时间片划分的提醒算法设计与实现
服务器·数据库·算法
曹牧19 小时前
Oracle:单一索引和联合索引
数据库·oracle
Gauss松鼠会20 小时前
【GaussDB】从 sqlplus 到 gsql:Shell 中执行 SQL 文件方案的迁移与改造
数据库·sql·database·gaussdb
汽车仪器仪表相关领域20 小时前
光轴精准校准,安全检测基石——JZD-1/2前照灯检测仪用校准灯项目实战分享
数据库·算法·安全·汽车·压力测试·可用性测试
爱可生开源社区20 小时前
MySQL 优化从库延迟的一些思路
数据库·mysql·性能优化