binlog2sql代码解读

这是学习笔记的第 1895 篇文章

今天看了下binlog2sql的代码,总体来说是代码质量是很高的。

通过阅读好的开源项目,也能够让自己多沉淀些学习经验。

binlog2sql的工程主要包含两个Python文件,一个是binlog2sql.py,这个文件是对外统一使用的脚本入口,另外一个是工具类binlog2sql_util.py

util类的方法略多一些,核心的方法有2个。

核心的方法是generate_sql_pattern,主要的闪回逻辑在这里。

这部分逻辑是相对通用的,而不是只局限于使用binlog2sql

通读源代码后,发现有一个潜在的瓶颈点就是在处理binlog的时候,使用了开源项目python-my-replication来模拟从库

这类方案和阿里的canal是类似的。

里面解析binlog的方法是基于BinLogStreamReader

我们来看一个简单的小例子,使用BinlogStreamReader来做下解析。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from pymysqlreplication import BinLogStreamReader

from pymysqlreplication.row_event import (

DeleteRowsEvent,

UpdateRowsEvent,

WriteRowsEvent,

)

import sys

import json

def main():

MYSQL_SETTINGS = {'host': 'xxxx',

'port': 3306, 'user': 'replicator', 'passwd': 'xxxx'}

stream = BinLogStreamReader(

connection_settings=MYSQL_SETTINGS,

server_id=3,

blocking=True,

only_schemas=["test"],

only_events=[DeleteRowsEvent, WriteRowsEvent, UpdateRowsEvent])

for binlogevent in stream:

for row in binlogevent.rows:

event = {"schema": binlogevent.schema, "table": binlogevent.table}

if isinstance(binlogevent, DeleteRowsEvent):

event["action"] = "delete"

event["values"] = dict(row["values"].items())

event = dict(event.items())

elif isinstance(binlogevent, UpdateRowsEvent):

event["action"] = "update"

event["before_values"] = dict(row["before_values"].items())

event["after_values"] = dict(row["after_values"].items())

event = dict(event.items())

elif isinstance(binlogevent, WriteRowsEvent):

event["action"] = "insert"

event["values"] = dict(row["values"].items())

event = dict(event.items())

print json.dumps(event)

sys.stdout.flush()

stream.close()

if __name__ == "__main__":

main()

执行结果如下:

{"action": "insert", "table": "tb", "values": {"id": 30, "v": "aaa"}, "schema": "test"}

{"action": "insert", "table": "tb", "values": {"id": 31, "v": "aaa"}, "schema": "test"}

{"action": "insert", "table": "tb", "values": {"id": 32, "v": "aaa"}, "schema": "test"}

{"action": "insert", "table": "tb", "values": {"id": 33, "v": "aaa"}, "schema": "test"}

{"action": "insert", "table": "tb", "values": {"id": 34, "v": "aaa"}, "schema": "test"}

可以看到采用了集成的方式解析Binlog,格式是相对比较规范的,但是这种方式的一个明显问题就是性能,如果文件在50M以内,解析效果还能接受,如果binlog超过了200M,解析性能就很差了,如果是1G的规模,基本上就没有反应了。

所以明确了binlog2sql的代码逻辑后,我们需要做的一些改进就可以主要在BinLogStreamReader的方案思路上进行改进。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:杨建荣

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL中的change,modify和自增列的关系(r12笔记第70天)

    关于MySQL里的change和modify,总是看到两种不同的语法,在Oracle中语法有modify,如果修改表名有rename。 alter tab...

    jeanron100
  • 关于pl/sql中的绑定变量(r3笔记第73天)

    在看关于shared pool的文档时,必定会提到绑定变量,也能够通过几个简单的例子对绑定变量带来影响有深刻的认识,但是在工作中,可能有时候我们就忘了绑定变量的...

    jeanron100
  • 一个MySQL连接问题的优化过程

    今天有一个开发同事反馈说通过sqoop在大数据和MySQL之间同步数据的时候,报了一个连接失败的错误。

    jeanron100
  • 开启mysql远程访问的权限

    用户1409099
  • 基于用户登陆的struts2中action的分类详解

    在struts2中action的分类有:继承 ActionSupport 实现 Action,模型驱动(ModelDriven)的 Action,多方法的 Ac...

    lzugis
  • 吴恩达深度学习笔记 course 2 1.1~1.14 深度学习的实用层面

    在构建一个神经网络的时候我们往往需要设计很多参数,如:layers,learning rates ,acivation functions,hidden uni...

    Dar_Alpha
  • MIT研究员研发“可编程水滴”,可实现精准操控沿轨道移动 | 黑科技

    镁客网
  • ztree实现一棵树

    前面陆陆续续的写过一些ztree的文章,但调用的是后端的接口,demo拿过去没有办法可以直接查看前端的界面,这就造成了一部分人对此理解的困扰。

    祈澈菇凉
  • SAP Cloud Application Studio里试图创建Lead扩展字段失败的错误消息

    The entity BO Node /YOHROS1BY C6FDB2AOA5DBAFF1F is unknown

    Jerry Wang
  • 开发 | 如何在微信小程序的页面间传递数据?

    我们在之前发布过小程序页面传值方法的简单介绍,说明了在小程序开发中,两种常见的页面之间传值方法。

    知晓君

扫码关注云+社区

领取腾讯云代金券