MyFlash 是一个回滚 DML 操作的工具,该工具是开源的。通过该工具,可以实现 MySQL 数据库误操作的闪回。
安装 git gcc glib-2.0
yum install -y git gcc glib2 libgnomeui-devel
下载 MyFlash 镜像
git clone https://gitee.com/wufengsheng/MyFlash.git
cd MyFlash
动态编译链接安装
gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback
MyFlash 常用选项解析
[root@localhost MyFlash]# pwd
/home/MyFlash
[root@localhost MyFlash]# ./flashback --help
语法解析:
--databaseNames : 需要闪回的数据库名称,如果有多个数据库,用逗号” ,” 隔开。
--tableNames : 要闪回的表名称,如果有多个表,用逗号”,” 隔开。
--start-position :闪回的起始位置,如不指定,从文件开始处回滚。
--stop-position : 闪回的终止位置,如不指定,回滚到文件结尾。
--start-datetime : 闪回的开始时间。
--stop-datetime : 闪回的终止时间。
--sqlTypes : 指定需要回滚的sql 类型,支持INSERT 、UPDATE 、DELETE ,多个类型使用逗号”,” 分开。
--maxSplitSize : 对文件进行固定尺寸的切割,以防止单次应用binlog 尺寸较大,对线上造成压力。
--binlogFileNames : 指定需要回滚的binlog 文件,美团文档说目前只支持单个binlog 文件,经测试已经支持多个binlog 文件同时闪回。
--outBinlogFileNameBase :指定输出的binlog 文件前缀,如不指定,则默认为binlog_output_base.flashback 。
logLevel : 仅供开发者使用,默认级别为error 级别。在生产环境中不要修改这个级别,否则输出过多。
include-gtids : 指定需要回滚的gtid, 支持gtid 的单个和范围两种形式。
exclude-gtids : 指定不需要回滚的gtid ,用法同include-gtids 。
数据库版本:MySQL8.0.26
操作系统版本:Centos 7.9
原表 province_info 数据如下
另一个张备份表 province_info_bak 数据如下
我们需要将 province_info 的字段 province_name 内容与 province_info_bak 改成一样
执行了如下误操作语句
root@localhost:testdb 15:12:09> update province_info,province_info_bak set province_info.province_name=province_info_bak.province_name;
误操作后的结果如下
恢复过程
确认 update 误操作时间,找到对应 binlog 文件,获取准确的开始和结束 pos ,不要选择 GTID 的 pos 点
mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000021 | grep -C 15 'province_info'
进行 update 误操作 SQL 反解析,生成解析后的二进制日志文件
./flashback --databaseNames=testdb --tableNames=province_info --sqlTypes='UPDATE' --start-position=4553 --stop-position=5906 --binlogFileNames=/data/mysql/mysql8.0.26/logs/mysql-bin.000021 --outBinlogFileNameBase=province_info
恢复数据
[root@localhost binary]# /data/mysql/mysql8.0.26/bin/mysqlbinlog --skip-gtids=true province_info.flashback | /data/mysql/mysql8.0.26/bin/mysql -uroot -pjXSXlLHkSHnoMp78UYKy -A -S /data/mysql/mysql8.0.26/mysql.sock -P3307
确认数据是否恢复
执行了如下误操作语句
root@localhost:testdb 16:19:44>delete from province_info where id between 1 in 17;
恢复过程
确认 delete 误操作时间,找到对应 binlog 文件,获取准确的开始和结束 pos ,不要选择 GTID 的 pos 点
/data/mysql/mysql8.0.26/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000021 | grep -C 100 'province_info' | grep -C 15 'DELETE'
进行 delete 误操作 SQL 反解析,生成解析后的二进制日志文件
[root@localhost binary]# ./flashback --databaseNames=testdb --tableNames=province_info --sqlTypes='DELETE' --start-position=7971 --stop-position=8447 --binlogFileNames=/data/mysql/mysql8.0.26/logs/mysql-bin.000021 --outBinlogFileNameBase=province_info_delete
恢复数据
[root@localhost binary]# /data/mysql/mysql8.0.26/bin/mysqlbinlog --skip-gtids=true province_info_delete.flashback | /data/mysql/mysql8.0.26/bin/mysql -uroot -pjXSXlLHkSHnoMp78UYKy -A -S /data/mysql/mysql8.0.26/mysql.sock -P3307
验证数据是否恢复
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30310891/viewspace-3062373/ ,如需转载,请注明出处,否则将追究法律责任。