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

 更新时间:2025年01月22日 14:50:47   作者:王小工  
本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录,并展示了一个简单的Python脚本,该脚本读取Binlog事件并打印出插入、更新和删除操作的SQL语句,此外,还提到可以使用pandas将结果输出到Excel表格中进行数据分析处理

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

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

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

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

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

1.安装pymysqlreplication

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

pip install pymysqlreplication

2.配置MySQL

确保你的MySQL服务器启用了Binlog,并且你有一个具有足够权限的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 binlogevent.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())
                elif 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)
                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语句。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python机器学习特征重要性分析的8个常用方法实例探究

    Python机器学习特征重要性分析的8个常用方法实例探究

    本文详细介绍8种常用的方法,涵盖了基于决策树、集成学习模型以及统计学方法的特征重要性分析,从决策树模型到SHAP值,深入探讨每种方法的原理和示例,帮助全面了解如何评估特征的重要性,将能更好地理解特征对模型预测的贡献,为提升模型性能和解释模型决策提供有力支持
    2024-01-01
  • Python机器学习NLP自然语言处理基本操作之京东评论分类

    Python机器学习NLP自然语言处理基本操作之京东评论分类

    自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法
    2021-10-10
  • python中argparse模块用法实例详解

    python中argparse模块用法实例详解

    这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下
    2015-06-06
  • 全面掌握Python JSON库函数与方法学会JSON数据处理

    全面掌握Python JSON库函数与方法学会JSON数据处理

    Python提供了内置的JSON库,允许在Python中解析和序列化JSON数据,本文将深入研究Python中JSON库的各种函数和方法,为你提供丰富的示例代码来帮助掌握JSON处理的方方面面
    2024-01-01
  • python not运算符的实例用法

    python not运算符的实例用法

    在本篇文章里小编给大家整理了一篇关于python not运算符的实例用法,有需要的朋友们可以学习参考下。
    2021-06-06
  • Python项目管理的利器Poetry的使用

    Python项目管理的利器Poetry的使用

    在 Python 项目开发中,包管理、依赖管理和虚拟环境的创建一直是开发者们经常面对的难题,本文主要介绍了Python项目管理的利器Poetry的使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Python多版本管理工具pyenv安装及使用详解

    Python多版本管理工具pyenv安装及使用详解

    pyenv是一个高效的Python版本管理工具,支持多版本共存和灵活切换,它通过修改环境变量实现版本隔离,本文就来详细的介绍一下Python多版本管理工具pyenv安装及使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-11-11
  •  python中字符串的常见操作总结(二)

     python中字符串的常见操作总结(二)

    这篇文章主要介绍了python中字符串的常见操作,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • python 日志模块logging的使用场景及示例

    python 日志模块logging的使用场景及示例

    这篇文章主要介绍了python 日志模块logging的使用场景及示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • Python字符串拼接的4种方法实例

    Python字符串拼接的4种方法实例

    字符串是所有编程语言中都有的基本变量的类型 ,程序员基本每天都在和字符串打交道,下面这篇文章主要给大家介绍了关于Python字符串拼接的4种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07

最新评论