在mysql日常运维中, 难免遇到需要回滚binlog的时候, 市面上能回滚binlog的工具还挺多的, 但都各种小问题, 今天我就来简单测评一下. 从使用难易度, 兼容性(主要测试5.7, 8.0, 8.4), 流行度, 最近一次维护时间等方面进行综合评价.
回滚难度大的时候, 就备份+日志回放吧. 也可以配置延迟从库.
测试环境说明(均开启gtid):
OS: centos 7.9
mysql 5.7.38
mysql 8.0.28
mysql 8.4.0
测试SQL参考如下:
-- 数据准备
create table db1.t20250313_test_binlog(id int, name varchar(200), update_time datetime);
insert into db1.t20250313_test_binlog values(1, 'ddcw', now());
insert into db1.t20250313_test_binlog values(2, 'https://github.com/ddcw', now());
flush logs;
begin;
delete from db1.t20250313_test_binlog where id=1;
commit;
测试数据仅供参考, 实际使用请以自己情况为准. 5.7和8.0是mysql的主流版本, 8.4是LTS的.
这里测试的均为能在互联网上免费下载的.
这里只进行简单的测试, 不会测试复杂事务, 复杂数据类型等情况.
第一款上场的是 binlog2sql, 这款工具在业内算是很出名的了, 该工具使用python开发的, 是基于python-mysql-replication开发的一款能解析Binlog生成回滚SQL语句的工具.
mysql -h127.0.0.1 -P3308 -uroot -p123456 -e 'select @@version'
python binlog2sql.py --flashback -h127.0.0.1 -P3308 -uroot -p123456 -ddb1 --start-file='m3308.001408'
8.4环境移除了show master status
, 现在是使用show binary log status;
来查看位点信息了. 所以会遇到如下报错.
我们稍微修正下代码再来测试下. 又遇到了pymysqlreplication的编码问题. 这个问题我们就不继续修复了.
分类 | 得分 | 说明 |
---|---|---|
流行度 | 5星 | github上start数量为3.4K, 足见其流行度 |
是否易于使用 | 4星 | 未提供二进制包,使用时得配置环境或者提前编译. |
兼容性 | 3星 | 不支持mysql8.4 |
维护频率 | 1星 | 最后一次是7年前维护了 |
是否支持离线使用 | 1星 | 不支持离线使用 |
MyFlash是由美团点评公司技术工程部开发维护的一个回滚DML操作的工具. 该工具通过解析v4版本的binlog,完成回滚操作.
./flashback --binlogFileNames=/data/mysql_3308/mysqllog/binlog/m3308.001408 --outBinlogFileNameBase=mysql57
mysqlbinlog -vvv mysql57.flashback
分类 | 得分 | 说明 |
---|---|---|
流行度 | 5星 | github上start数量为1.2K, 足见其流行度 |
是否易于使用 | 4星 | 虽然提供了二进制包, 但是只是生成binlog文件, 还需要结合mysqlbinlog来使用 |
兼容性 | 5星 | 连mysql8.4都支持了 |
维护频率 | 3星 | 最后一次维护虽然是5年前了, 但问题相对少很多 |
是否支持离线使用 | 5星 | 支持离线使用 |
my2sql是go版MySQL binlog解析工具.基于my2fback、binlog_rollback工具二次开发而来.
分类 | 得分 | 说明 |
---|---|---|
流行度 | 4星 | github上start数量为700+ |
是否易于使用 | 3星 | 虽然提供了二进制包, 但参数过于复杂 |
兼容性 | 5星 | 支持范围挺广的 |
维护频率 | 4星 | 最后一次维护虽然是3年前了 |
是否支持离线使用 | 1星 | 不支持离线使用 |
mariadb的mysqlbinlog是支持回滚binlog的. 使用的时候加个 --flashback
即可
./mariadb-binlog /data/mysql_3308/mysqllog/binlog/m3308.001408 -vvv --flashback
上面没有做完整的验证, 实际上还得考虑写入数据库的场景. (得去掉gtid,check_constraint_checks之类的)
分类 | 得分 | 说明 |
---|---|---|
流行度 | 5星 | 这可是mariadb啊 |
是否易于使用 | 5星 | 回滚只需要加个--flashback即可 |
兼容性 | 3星 | 虽然支持mariadb和mysql, 但在解析mysql时,会还是有些小问题. |
维护频率 | 5星 | 官方一直在更新 |
是否支持离线使用 | 5星 | 支持离线使用 |
最后来个私货:pymysqlbinlog 相当于给mysqlbinlog加个flashback功能, 但流行度很低, 未知问题挺多的. 对binlog结构感兴趣的,可以选择此工具二次开发.
上述几款工具各有优缺点. 汇总如下:
工具 | 优点 | 缺点 |
---|---|---|
binlog2sql | 使用广泛 | 不支持mysql8.4,且长期未维护了 |
myflash | 兼容性好,支持离线解析 | 无法一步到位,得搭配mysqlbinlog使用 |
my2sql | 兼容性好 | 不支持离线使用,且参数过于复杂 |
mariadb-binlog | 官方支持的能回滚Binlog的工具 | 解析的mysql的binlog无法直接回放到数据库 |
pymysqlbinlog | 未知问题多,无相关案例 | 纯python编写,无依赖 |
基于python-mysql-replication二次开发的解析binlog的工具市面上还有很多的.
综合来说: 推荐使用myflash或者my2sql
上述评价为个人观点, 仅作参考. 实际使用请根据自己情况来.
参考:
https://github.com/danfengcao/binlog2sql
https://github.com/julien-duponchelle/python-mysql-replication
https://github.com/Meituan-Dianping/MyFlash
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。