- 优点:
- 快 // 比binlog2sql快
- 原生binlog格式
- 安装简单
- 功能强大
- 不需要账号密码连接
- 缺点:
- 必须为行模式 rows
安装依赖
yum install glib2-devel gcc -y
下载包
# 可能无法访问推荐迅雷下载即可
wget https://github.com/Meituan-Dianping/MyFlash/archive/refs/heads/master.zip
解压
unzip master.zip
进入目录
cd MyFlash-master
安装
## 动态编译 (推荐)
gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback
## 静态编译
gcc -w -g `pkg-config --cflags glib-2.0` source/binlogParseGlib.c -o binary/flashback /usr/lib64/libglib-2.0.a -lrt
查看用法
cd binary/
./flashback --help
Usage:
flashback [OPTION?]
Help Options:
-h, --help Show help options
Application Options:
--databaseNames #库名
--tableNames #表名
--tableNames-file #表名文件路径
--start-position #起始位置
--stop-position #停止位置
--start-datetime #开始时间 格式(format %Y-%m-%d %H:%M:%S)
--stop-datetime #停止时间 格式(format %Y-%m-%d %H:%M:%S)
--sqlTypes #要筛选的sql类型。支持INSERT, UPDATE ,DELETE.。
--maxSplitSize #拆分后的最大文件大小,单位为 M # 文件拆分
--binlogFileNames #要处理的binlog文件。
--outBinlogFileNameBase #输出binlog文件名
--logLevel #日志级别,可用选项为 debug,warning,error
--include-gtids #要处理的GTID。
--include-gtids-file #要处理的GTID。
--exclude-gtids #要跳过的GTID。
--exclude-gtids-file #要跳过的GTID。
实战用法
# 一般生产是指定起始position进行单表回滚的可自行添加使用
cd binary/
./flashback \
--logLevel=error \
--databaseNames=test \
--tableNames=t1 \
--sqlTypes=update \
--binlogFileNames=/mydata/3306/binlog/mysql-bin.000002,/mydata/3306/binlog/mysql-bin.000003 \
--outBinlogFileNameBase=/tmp/roll_update_1
导入到数据库
# 将二进制文件转化为mysql可识别的格式 并跳过gtid
mysqlbinlog --skip-gtids roll_update_1.flashback >roll_update_1.flashback_bak
# 登录mysql
mysql -S /root/mysql-sandboxes/3306/sandboxdata/mysqld.sock -p
# 进库
use test
# 导入到数据库
mysql> source /tmp/roll_update_1.flashback_bak
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
检查数据是否恢复
问题
回滚时状态条数会显示为0 但其实执行成功了
建议单个文件去回滚,从后往前回滚,先回滚数字大的binlog文件,最好按回滚顺序标记好 1、2、3这样好回滚
在source时加begin是无法回滚source的SQL的
# 解决
如果想使用begin; commit; or rollback;的话
要在恢复文件中开头写上begin; 并删除文本中所有的commit语句
在导入完成后,检查数据是否正确,正确则在命令行commit;错误则rollback;
建议不要在导入大文件时使用这种方法
# 建议没有从库的情况下导入时不写入binlog
没有从库的情况下哈
set sql_log_bin=0;
set sql_log_bin=1;
分享是一种精神
好用点个赞谢谢