使用 mysql-replication python监听mysql binlog 实时同步数据

使用 mysql-replication python监听mysql binlog 实时同步数据


前言

数据库的基础信息需要频繁访问,需要存入redis 轮询存入需要占用资源,并且不是实时,使用mysql-replication可解决此问题。


一、环境

  1. mysql-replication0.23
  2. python3.7
  3. miniconda4.8.3 (https://blog.csdn.net/mtl1994/article/details/114968140)

二、安装与配置

1.首先安装mysql-replication

pip install mysql-replication

2.参数

BinLogStreamReader()参数
ctl_connection_settings:集群保存模式信息的连接设置
resume_stream:从位置或binlog的最新事件或旧的可用事件开始
log_file:设置复制开始日志文件
log_pos:设置复制开始日志pos(resume_stream应该为true)
auto_position:使用master_auto_position gtid设置位置
blocking:在流上读取被阻止

only_events:允许的事件数组
ignored_events:被忽略的事件数组

only_tables:包含要观看的表的数组(仅适用于binlog_format ROW)
ignored_tables:包含要跳过的表的数组

only_schemas:包含要观看的模式的数组
ignored_schemas:包含要跳过的模式的数组

freeze_schema:如果为true,则不支持ALTER TABLE。速度更快。
skip_to_timestamp:在达到指定的时间戳之前忽略所有事件。
report_slave:在SHOW SLAVE HOSTS中报告奴隶。
slave_uuid:在SHOW SLAVE HOSTS中报告slave_uuid。
fail_on_table_metadata_unavailable:如果我们无法获取有关row_events的表信息,应该引发异常
slave_heartbeat:(秒)主站应主动发送心跳连接。这也减少了复制恢复时GTID复制的流量(在许多事件在binlog中跳过的情况下)。请参阅mysql文档中的MASTER_HEARTBEAT_PERIOD以了解语义

3.配置数据库

show variables like 'log_bin';
#显示on
show variables like 'binlog_format';  
#显示row
#如果不是 修改下 my.cnf 重启一下

4.读取binlog日志

#m.get_s() 封装的数据库对象 格式
#self.mysql_settings = {
#    'host': '127.0.0.1',
#    'port': 3306,
#    'user': 'root',
#    'passwd': 'root'
#}

ef main(r):

    # 实例化binlog 流对象
    stream = BinLogStreamReader(
        connection_settings=m.get_s(),
        server_id=1,  # slave标识,唯一
        blocking=True,  # 阻塞等待后续事件
        # 设定只监控写操作:增、删、改
        only_schemas=['env'],
        ignored_tables=['env_data_mon_log','env_data_his_log'],
        freeze_schema=True,
        only_events=[
            DeleteRowsEvent,
            UpdateRowsEvent,
            WriteRowsEvent
        ]
    )
    for binlogevent in stream:
        try:
            binlogevent.dump()  # 打印所有信息
            for row in binlogevent.rows:
                # 打印 库名 和 表名
                event = {"schema": binlogevent.schema, "table": binlogevent.table}
                print(event)
                if isinstance(binlogevent, DeleteRowsEvent):
                    event["action"] = "delete"
                    event["data"] = row["values"]

                elif isinstance(binlogevent, UpdateRowsEvent):
                    event["action"] = "update"
                    event["data"] = row["after_values"]  # 注意这里不是values

                elif isinstance(binlogevent, WriteRowsEvent):
                    event["action"] = "insert"
                    event["data"] = row["values"]

                print(json.dumps(event, cls=DateEncoder))
                sys.stdout.flush()
                #存入redis队列 ,在创建一个消费者程序 把数据存入redis
                r.lpush(config.sync.q_name,json.dumps(event, cls=DateEncoder))
        except Exception as e:
            traceback.print_exc()
    # stream.close()  # 如果使用阻塞模式,这行多余了


if __name__ == '__main__':
    r = initRedis()
    main(r)
"""
输出数据格式
{
    "schema": "demo",    # 数据库名
    "table": "student",  # 表名
    "action": "update",  # 动作 insert、delete、update
    "data": {            # 数据,里边包含所有字段
        "id": 26, 
        "name": "haha", 
        "age": 34, 
        "update_time": "2019-06-06 16:59:06", 
        "display": 0
    }
}
"""

image-20210409171206911


总结

~~~

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 使用Python my-replication读取MySQL binlog可以使用Python第三方库`pymysqlreplication`。 你需要先安装这个库,可以使用命令`pip install pymysqlreplication`进行安装。 然后,你可以使用以下代码读取MySQL binlog: ``` from pymysqlreplication import BinLogStreamReader # 创建BinLogStreamReader对象 stream = BinLogStreamReader( connection_settings = { "host": "localhost", "port": 3306, "user": "root", "passwd": "password" }, server_id=100, blocking=True, only_events=[DeleteRowsEvent, WriteRowsEvent, UpdateRowsEvent] ) # 循环读取事件 for binlogevent in stream: event_type = binlogevent.event_type if event_type == "write_rows": # 处理insert操作 pass elif event_type == "update_rows": # 处理update操作 pass elif event_type == "delete_rows": # 处理delete操作 pass # 关闭BinLogStreamReader stream.close() ``` 在上面的代码中,我们只读取了`DeleteRowsEvent`、`WriteRowsEvent`和`UpdateRowsEvent`三种事件,你也可以根据需要选择性的读取其他事件。 ### 回答2: 利用Python的my-replication库可以轻松地读取MySQLbinlog文件。my-replication提供了一种方便的方式来解析和处理binlog事件。 首先,我们需要安装my-replication库。可以使用pip来安装,命令为pip install my-replication。 然后,我们需要连接到MySQL数据库。可以使用my-replication中的BinLogStreamReader类来连接并读取binlog文件。你需要提供MySQL服务器的主机地址、用户名、密码等信息来建立连接。 接下来,我们可以使用BinLogStreamReader实例化一个对象,并传入需要读取的binlog文件的路径和文件名。 然后,我们可以使用for循环来逐个读取binlog事件。在循环内部,我们可以根据事件的类型来处理不同类型的事件,例如查询事件、插入事件、更新事件等。my-replication为每种类型的事件提供了相应的处理方法和属性。 最后,我们需要在循环结束后关闭BinLogStreamReader对象,并断开与MySQL数据库的连接。 利用Python的my-replication库读取MySQLbinlog文件可以帮助我们实现一些有趣和实用的功能,例如数据同步数据备份、数据恢复等。同时,通过解析和处理binlog文件,我们还可以了解数据库的操作历史和变化。 总结来说,利用Python的my-replication库读取MySQLbinlog文件是一种方便的方式。我们只需几行代码就可以连接到MySQL数据库并读取binlog事件。这为我们处理和分析数据库的操作历史提供了很大的便利。 ### 回答3: 使用Python中的my-replication库可以轻松地读取MySQLbinlog。下面是一个简单的步骤来实现这一点: 1. 首先,确保你已经安装了Python和my-replication库。你可以使用pip命令来安装库:`pip install my-replication`。 2. 导入my-replication库:`from mysql import replication` 3. 创建一个BinlogStreamReader对象来读取binlog文件。需要提供MySQL服务器的相关信息,例如主机名、端口号、用户名和密码。下面是一个示例代码: ``` stream = replication.BinlogStreamReader( connection_settings={ "host": "localhost", "port": 3306, "user": "root", "passwd": "password" }, server_id=100, blocking=True ) ``` 在上述代码中,我们使用了本地主机和默认MySQL端口号3306,同时提供了root用户和相应的密码。 4. 接下来,我们可以使用stream对象来读取binlog事件。可以使用for循环迭代stream对象,获取每个事件,并处理它们。下面是一个简单的示例代码,将事件打印出来: ``` for binlog_event in stream: print(binlog_event) ``` 在这个示例中,我们只是简单地将每个binlog事件打印出来。你可以根据你的需求,在这个循环里处理binlog事件。 5. 最后,记得在结束时关闭stream对象,以释放资源:`stream.close()`。 通过以上步骤,你可以使用Python的my-replication库来读取MySQLbinlog,并且可以根据需要对每个binlog事件进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mtl1994

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值