首页 > 数据库 >使用 mysql-replication python监听mysql binlog 实时同步数据

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

时间:2023-06-02 12:07:46浏览次数:43  
标签:binlog python mysql data event binlogevent row


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


文章目录

  • 使用 mysql-replication python监听mysql binlog 实时同步数据
  • 前言
  • 一、环境
  • 二、安装与配置
  • 1.首先安装mysql-replication
  • 2.参数
  • 3.配置数据库
  • 4.读取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
    }
}
"""

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


总结

~~~


标签:binlog,python,mysql,data,event,binlogevent,row
From: https://blog.51cto.com/u_16015778/6401411

相关文章

  • 使用 wkhtmltopdf python html转pdf
    使用wkhtmltopdfpythonhtml转pdf文章目录使用wkhtmltopdfpythonhtml转pdf前言一、环境二、安装与配置1.首先安装pdfkit0.612.pythonhtml转pdf3.url转pdf遇到的问题总结前言使用wkhtmltopdfpythonhtml转pdf。一、环境pdfkit0.61python3.7二、安装与配置1.首先安装pdfk......
  • python包上传到pypi过程
    python包上传到pypi过程提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录python包上传到pypi过程前言一、pypi是什么?二、使用步骤1.创建目录结构2.创建pyproject.toml3.创建README.md4.创建许可证5.打包6.注册pypi账号和testpypi账号7.上传到testpypi8......
  • 项目场景:python pyqt5 threading 多线程 数据混乱
    项目场景:pythonpyqt5threading多线程数据混乱根据配置文件多线程调用接口#问题描述:参考http://www.starky.ltd/2019/09/23/pro-python-concurrency-with-multi-threading/多线程调用接口,取得数据回调修改页面上的值发生混乱不准#原因分析:运行线程数量过多没有顺序......
  • python 使用 openpyxl 操作 excel
    python使用openpyxl操作excel文章目录python使用openpyxl操作excel前言1.环境2.读取数据3.openpyxl前言二、使用zipfile、openpyxl、flask批量导出excelzip1.环境openyxl:3.0.6python:3.7.6pandas:1.3.52.读取数据#使用pandas读取数据#https://pandas.pydata.org/docs......
  • Mysql / MariaDB 操作 《 json 》 字段
    Mysql/MariaDB操作《json》字段Mysql/MariaDB操作《json》字段提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Mysql/MariaDB操作《json》字段前言环境一、数据库结构二、使用方法1.查找json_value字段中a字段等于1三、常用方法总......
  • MySQL 数据库巡检,DBA应该怎么做?
    一套正常运行的系统是一个复杂的系统工程,牵涉到主机、操作系统、网络、数据库、中间件、底层存储,还有系统的核心:应用。任何层面的故障都可能造成系统的不可用。今天聊一聊数据库层面的巡检问题。数据库巡检的目的:保障数据库的正常运行,保证数据的安全性,完整性、可靠性。这篇文章......
  • python 中json数据可以以类似数组的方法访问 print(j["age"]["nian"])
    使用Python处理Json数据-猫坚果NutCat-博客园(cnblogs.com)JSON模组的常用方法load/loads:把JSON转换为Python#somejsonsomebody_info='{"name":"WenjieYe","age":75,"nationality":"China"}'#parse......
  • CentOS 下 MySQL 服务搭建
    1.卸载旧MySQL查看rpm包rpm-qa|grepmysql如果存在,使用如下命令卸载rpm-e查找是否存在mysql相关目录find/-namemysql卸载系统自带mariadb[root@localhost~]#rpm-qa|grepmariadbmariadb-libs-5.5.68-1.el7.x86_64mariadb-libs-5.5.64-1.el7.x86_64[root@localh......
  • Python中字典取值常用的方法!
    字典是Python中比较常见的数据类型之一,它是一种可变容器模型,可以存储任意数量的任意类型的数据,而且字典中的每个元素由一个键和一个值组成,键和值之间用冒号分隔。本文为大家介绍一下Python中字典取值常用的方法,跟着学习一下吧。1、使用方括号[]运算符使用方括号[]运算......
  • python算法学习——第1天
    目录1、3,5,7的倍数判定2、鸡兔同笼3、计算有n个字符串中最长的字符串长度4、输出10个不重复的英文字母5、统计一段文字的单词个数并按字母顺序排序输出6、字典合并7、最大公约数&最小公倍数8、输出全排列9、输出<=n的全部回文数10、重复元素判定1、3,5,7的倍数判定num=int(inp......