前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >binlog2sql 打包为二进制

binlog2sql 打包为二进制

原创
作者头像
大大刺猬
发布2023-03-15 19:04:21
5560
发布2023-03-15 19:04:21
举报
文章被收录于专栏:大大刺猬大大刺猬

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

题外话

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

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

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

binlog2sql使用和打包

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

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

源码使用

直接使用

代码语言:shell
复制
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 的是各二进制字符串....
发现use 的是各二进制字符串....

稍微改进改进

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

代码语言:python
复制
    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就是字符串类型了.
现在的database name就是字符串类型了.

打包为二进制

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

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

执行如下命令打包

代码语言:javascript
复制
pyinstaller -F binlog2sql.py

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

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

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

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

代码语言:javascript
复制
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. 而已
就是加个binlog2sql. 而已

然后重新打包

pyinstaller -F binlog2sql.py

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

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

pymysql 1.0 环境

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

代码语言:javascript
复制
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()
就是加个.cursor()

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

就是加个.cursor()
就是加个.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 (只是多个点.而已)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题外话
  • binlog2sql使用和打包
    • 源码使用
      • 直接使用
      • 稍微改进改进
    • 打包为二进制
    • pymysql 1.0 环境
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档