zl程序教程

您现在的位置是:首页 >  其他

当前栏目

binlog2sql 打包为二进制

2023-06-13 09:17:27 时间

上一章讲了binlog解析, 准备自己也写个解析Binlog的软件, 但是太耗时耗力了.... 还是使用现成的软件吧.

题外话

还是看一下我写的效果吧.....

(数据均使用fake模拟的,无真实数据哈)

主要难点是解析各字段数据类型. 而且字段名字在binlog里面没有记录, 所以要生成SQL的话还得连接数据库, 当然可以写个扩展把表结构信息导出来. 这些都是题外话了.

binlog2sql使用和打包

binlog2sql是基于pymysqlrepliction的, 支持正向解析SQL和反向解析为SQL

github地址 https://github.com/danfengcao/binlog2sql

源码使用

直接使用

wget https://github.com/danfengcao/binlog2sql/archive/refs/heads/master.zip
unzip binlog2sql-master.zip
cd binlog2sql-master
pip install -r requirements.txt #这里面的pymysql版本是0.7
cd binlog2sql

python binlog2sql.py -h127.0.0.1 -P3308 -uroot -p123456 -ddb1 --start-file='m3308.000995' | more
#其它使用这里就不掩饰了, 不属于本文范畴
发现use 的是各二进制字符串....

稍微改进改进

编辑binlog2sql_util.py, 修改为如下内容

    elif flashback is False and isinstance(binlog_event, QueryEvent) and binlog_event.query != 'BEGIN' \
            and binlog_event.query != 'COMMIT':
        if binlog_event.schema:
            try:
                sql = 'USE {0};\n'.format(binlog_event.schema.decode())
            except:
                sql = 'USE {0};\n'.format(binlog_event.schema)
        sql += '{0};'.format(fix_object(binlog_event.query))

再试一下

现在的database name就是字符串类型了.

打包为二进制

为啥要打包为二进制呢, 毕竟内网很多环境没得python 或者相关的依赖包....

本文使用pyinstaller打包(主要是自己熟悉一点), 也可以使用其它打包工具

执行如下命令打包

pyinstaller -F binlog2sql.py

打包好的二进制文件在 dist目录下面

使用打包好的二进制文件测试下

报错了,在第9行.... No module named 'binlog2sql_util'

说没得binlog2sql_util模块, 我们修改下binlog2sql.py文件的第9行如下

from binlog2sql.binlog2sql_util import command_line_args, concat_sql_from_binlog_event, create_unique_file, temp_open, reversed_lines, is_dml_event, event_type
就是加个binlog2sql. 而已

然后重新打包

pyinstaller -F binlog2sql.py

没得问题了, 拷贝到其它环境试下

发现也没得问题. 以后就可以使用二进制的了.

pymysql 1.0 环境

如果你不是安装的指定的依赖. 比如你的环境是mysql-replication:0.31, pymysql1.0.2. 你运行binlog2sql会得到如下的报错

Traceback (most recent call last):
  File "binlog2sql.py", line 149, in <module>
    back_interval=args.back_interval, only_dml=args.only_dml, sql_type=args.sql_type)
  File "binlog2sql.py", line 48, in __init__
    cursor.execute("SHOW MASTER STATUS")
AttributeError: 'Connection' object has no attribute 'execute'

该错误原因为Connection对象不是cursor对象, 所以没得execute方法

解决办法如下:

修改binlog2sql.py如下内容(47行处)

就是加个.cursor()

修改binlog2sql.py如下内容(73行处)

就是加个.cursor()

然后再次使用就正常了(打包方法同上)

总结

binlog2sql已经很多年没有更新了, github上也没得二进制包... 但用的人还是不少的.

使用pyinstaller打包之前在 binlog2sql.py中修改下包的路径即可 from binlog2sql_util ==> from binlog2sql.binlog2sql_util

如果你经常使用pyinstaller还会遇到一些其它问题,

比如文件太长, 解决办法: 在xxx.spec添加sys.setrecursionlimit(5000) py不建议文件内容太长,不方便阅读

又比如在当前目录导入自己的包,编译后报错 No module named 'xxxx' 解决办法还是加个路径 from .xxxx import xxx (只是多个点.而已)