Python MySQL如何通过Binlog获取变更记录恢复数据

2025-01-23 04:50

本文主要是介绍Python MySQL如何通过Binlog获取变更记录恢复数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录...

Python MySQL通过Binlog获取变更记录恢复数据

通过MySQL的二进制日志(Binlog)获取数据库的变更记录,并用于恢复数据,是一个相对高级的操作。

这通常涉及读取Binlog中的事件,解析这些事件以了解数据变更的详细信息,然后基于这些信息来恢复或回滚数据。

在Python中,你可以使用pymysqlreplication库来读取Binlog,但请注意,这个库本身并不提供直接的数据恢复功能。它只能帮助你解析Binlog中的事件。恢复数据需要你根据这些事件编写额外的逻辑。

以下是一个使用pymysqlreplication库通过Binlog获取MySQL操作记录的示例:

1.安装pymysqlreplication

首先,你需要安装这个库。你可以使用pip来安装:

pip install pymysqlreplication

2.配置MySQL

确保你的MySQL服务器启用了B编程inlog,并且你有一个具有足够权限的MySQL用户来读取Binlog。

3.编写Python脚本

下面是一个简单的Python脚本,它使用pymysqlreplication.BinLogStreamReader来读取Binlog事件,并打印出插入、更新和删除操作的信息。

import json
import sys
from datetime import datetime
from pymysqlreplication import BinLogStreamReader
from pymysqlreplication.row_event import (
    DeleteRowsEvent,
    UpdateRowsEvent,
    WriteRowsEvent,
)
import pandas as pd

MYSQL_SETTINGS = {
    'host': '127.0.0.1',
    'port': 3306,
    'user': 'root',
    'password': '123456'
}
# 要监控的数据库和表 ssc_sjzz2
database_name = 'ssc_wfg'
table_name = 't_sys_user'

def default(o):
    if isinstance(o, datetime):
        return o.isoformat()
    raise TypeError("Unserializable object {}".format(o))
def main():
    stream = BinLogStreamReader(
        connection_settings=MYSQL_SETTINGS,
        server_id=6, # 必须与MySQL服务器上的其他复制客户端不同
        only_events=[DeleteRowsEvent, WriteRowsEvent, UpdateRowsEvent],
        only_tables=[table_name],
        only_schemas=[database_name]
        ) 
    df = pd.DataFrame()
    for binlogevent in stream:
        if binlogevent.table == table_name and binloghttp://www.chinasem.cnevent.schema == database_name:
            time = binlogevent.formatted_timestamp.replace('T', ' ')
            timestamp= binlogevent.timestamp
            for row in binlogevent.rows:
                event = {
                    "schema": binlogevent.schema, 
                    "table": binlogevent.table,
                    "time": time,
                    "timestamp": timestamp,
                    }
            
                if isinstance(binlogevent, DeleteRowsEvent):
                    event["action"] = "delete"
                    event["value"] = json.dumps(list(row["values"].items()), default=default)
                    # event = dict(event.items() + row["values"].items())
                KYMrOCelif isinstance(binlogevent, UpdateRowsEvent):
                    event["action"] = "update"
                    event["value"] = json.dumps(list(row["after_values"].items()), default=default)
                    # event = dict(event.items() + row["after_values"].items())
                elif isinstance(binlogevent, WriteRowsEvent):
                    event["action"] = "insert"
                    event["value"]编程 = json.dumps(list(row["values"].items()), default=default)
              js  print(json.dumps(event, default=default))
                df = pd.concat([df, pd.DataFrame(event, index=[0])], ignore_index=True)
    stream.close()
    df.to_excel('binlog.xlsx', index=False)
if __name__ == "__main__":
    main()

在这个脚本中:

  • MYSQL_SETTINGS包含了连接到MySQL服务器所需的设置。
  • BinLogStreamReader:包含了读取Binlog所需的设置,包括server_id(必须是一个唯一的标识符,用于区分不同的复制客户端)和only_events(指定我们感兴趣的事件类型)。
  • stream函数根据事件的类型(删除、更新或插入)打印出相应的SQL语句。
  • main:函数设置了Binlog流读取器,并在捕获到任何异常时优雅地关闭流。
  • pandas:将结果输出到excel表格中,用于数据进行分析处理。

4.运行脚本

运行这个Python脚本,它将连接到你的MySQL服务器,并开始读取Binlog中的事件。

每当有新的事件发生时(如插入、更新或删除操作),它都会打印出相应的SQL语句。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Python MySQL如何通过Binlog获取变更记录恢复数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153194

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明