上一章讲了binlog解析, 准备自己也写个解析Binlog的软件, 但是太耗时耗力了.... 还是使用现成的软件吧.
还是看一下我写的效果吧.....
(数据均使用fake模拟的,无真实数据哈)
主要难点是解析各字段数据类型. 而且字段名字在binlog里面没有记录, 所以要生成SQL的话还得连接数据库, 当然可以写个扩展把表结构信息导出来. 这些都是题外话了.
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
#其它使用这里就不掩饰了, 不属于本文范畴
编辑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))
再试一下
为啥要打包为二进制呢, 毕竟内网很多环境没得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
然后重新打包
pyinstaller -F binlog2sql.py
没得问题了, 拷贝到其它环境试下
发现也没得问题. 以后就可以使用二进制的了.
如果你不是安装的指定的依赖. 比如你的环境是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行处)
修改binlog2sql.py如下内容(73行处)
然后再次使用就正常了(打包方法同上)
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 删除。