MyFlash工具是美团开发的一个开源辅助性工具,主要用来恢复数据(误删删除是每个DBA比较头疼的事情)
MyFlash的安装和使用
下载地址:https://github.com/Meituan-Dianping/MyFlash
1.环境说明:
1)本机是centos7.x
2)mysql5.7.26 默认的binlog模式是row 且binlog_row_image=full
3)只支持DML语句的回滚(insert/delete/update)
2.安装
1)安装依赖包
>>yum -y install gcc* pkg-config glib2 libgnomeui-devel glib2-devel
2) 下载并安装Myflash工具
>>git clone XXXXXXXXXXXXXXXX
>>cd Myflash --->gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback 编译安装
3.使用
./flashback --binlogFileName=binlog文件 --start-position= --stop-position= --databaseNames=‘‘ --tableNames=‘‘ --sqlTypes=‘DELETE|INSERT|UPDATE‘
4.参数说明:
1.databaseNames 指定需要回滚的数据库名。多个数据库可以用“,”隔开。如果不指定该参数,相当于指定了所有数据库。 2.tableNames?指定需要回滚的表名。多个表可以用“,”隔开。如果不指定该参数,相当于指定了所有表。 3.start-position?指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚 4.stop-position?指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚 5.start-datetime?指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间 6.stop-datetime?指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间 7.sqlTypes?指定需要回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用“,”隔开。 8.maxSplitSize?一旦指定该参数,对文件进行固定尺寸的分割(单位为M),过滤条件有效,但不进行回滚操作。该参数主要用来将大的binlog文件切割,防止单次应用的binlog尺寸过大,对线上造成压力 9.binlogFileNames?指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持 10.outBinlogFileNameBase?指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback 11.logLevel?仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多 12.include-gtids?指定需要回滚的gtid,支持gtid的单个和范围两种形式。 13.exclude-gtids?指定不需要回滚的gtid,用法同include-gtids
解析文件后会在同名文件夹下生成 binlog_output_base.flashback 文件
5.恢复:
mysqlbinlog binlog_output_bash.flashback|mysql -u -p 建议先在测试环境进行恢复,研发进行数据校对,再进行线上恢复
6.结论
1.MyFlash生成的结果是原生binlog格式,所以要用mysqlbinlog应用,如果想可视化,用mysqlbinlog再度解析即可
2.MyFlash是离线解析,速度也很快,非常方面
3MyFlash能增强恢复精度,能根据操作类型过滤
7.补充:
1.经过最新测试 myflash是支持mysql5.7-MGR 架构数据恢复的
2.针对gtid复制模式,需要在应用回滚日志时加上--skip-gtids可以防止报错,恢复成功
案例1(测试成功:
(1)创建数据并修改数据
###创建数据 root@localhost:liulin>desc t; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | f | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) root@localhost:liulin>insert into t values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); Query OK, 10 rows affected (0.00 sec) Records: 10 Duplicates: 0 Warnings: 0 root@localhost:liulin> root@localhost:liulin> root@localhost:liulin>select * from t; +----+------+ | id | f | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 4 | | 5 | 5 | | 6 | 6 | | 7 | 7 | | 8 | 8 | | 9 | 9 | | 10 | 10 | +----+------+
####修改数据
root@localhost:liulin>update t set f=100 where id<5;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
root@localhost:liulin>select * from t;
+----+------+
| id | f |
+----+------+
| 1 | 100 |
| 2 | 100 |
| 3 | 100 |
| 4 | 100 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 | 9 |
| 10 | 10 |
+----+------+
(2)使用mysqlbinlog或show binlog events in ‘xxxxx‘找到闪回的起点和终点
例如:>>mysqlbinlog mysql-bin.000004 –base64-output=decode-rows -vv 可以更加详细查看binlog日志文件中的内容找到要恢复的起点位置和终点位置
(3)再使用flashback工具生产要闪回的文件
命令:>>flashback --binlogFileNames=/data/mysql/3308/binlog/mysql-bin.000004 --start-position=680 --stop-position=1005
这时会生成一个binlog_output_base.flashback
(4)然后再应用该文件到数据中执行数据库中数据闪回
命令:>>mysqlbinlog binlog_output_base.flashback --skip-gtids |mysql -uroot -p123 -S /data/mysql/3308/mysql.sock
(5)进行检查,看是否进行闪回成功
案例2:
基于时间点恢复:
>>
./binary/flashback --databaseNames="d1" --tableNames="t1" --start-datetime="2020-11-29 17:22:30" --stop-datetime="2020-11-29 17:24:30" --sqlTypes="UPDATE,DELETE" --binlogFileNames=/opt/mysql/log/binlog/3308/mysql-bin.000001 --outBinlogFileNameBase=test.sql
原文:https://www.cnblogs.com/zmc60/p/14471538.html