Python MySQL如何通過(guò)Binlog獲取變更記錄恢復(fù)數(shù)據(jù)
Python MySQL通過(guò)Binlog獲取變更記錄恢復(fù)數(shù)據(jù)
通過(guò)MySQL的二進(jìn)制日志(Binlog)獲取數(shù)據(jù)庫(kù)的變更記錄,并用于恢復(fù)數(shù)據(jù),是一個(gè)相對(duì)高級(jí)的操作。
這通常涉及讀取Binlog中的事件,解析這些事件以了解數(shù)據(jù)變更的詳細(xì)信息,然后基于這些信息來(lái)恢復(fù)或回滾數(shù)據(jù)。
在Python中,你可以使用pymysqlreplication庫(kù)來(lái)讀取Binlog,但請(qǐng)注意,這個(gè)庫(kù)本身并不提供直接的數(shù)據(jù)恢復(fù)功能。它只能幫助你解析Binlog中的事件?;謴?fù)數(shù)據(jù)需要你根據(jù)這些事件編寫(xiě)額外的邏輯。
以下是一個(gè)使用pymysqlreplication庫(kù)通過(guò)Binlog獲取MySQL操作記錄的示例:
1.安裝pymysqlreplication
首先,你需要安裝這個(gè)庫(kù)。你可以使用pip來(lái)安裝:
pip install pymysqlreplication
2.配置MySQL
確保你的MySQL服務(wù)器啟用了Binlog,并且你有一個(gè)具有足夠權(quán)限的MySQL用戶來(lái)讀取Binlog。
3.編寫(xiě)Python腳本
下面是一個(gè)簡(jiǎn)單的Python腳本,它使用pymysqlreplication.BinLogStreamReader來(lái)讀取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' } # 要監(jiān)控的數(shù)據(jù)庫(kù)和表 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服務(wù)器上的其他復(fù)制客戶端不同 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()
在這個(gè)腳本中:
MYSQL_SETTINGS
:包含了連接到MySQL服務(wù)器所需的設(shè)置。BinLogStreamReader
:包含了讀取Binlog所需的設(shè)置,包括server_id(必須是一個(gè)唯一的標(biāo)識(shí)符,用于區(qū)分不同的復(fù)制客戶端)和only_events(指定我們感興趣的事件類(lèi)型)。stream
:函數(shù)根據(jù)事件的類(lèi)型(刪除、更新或插入)打印出相應(yīng)的SQL語(yǔ)句。main
:函數(shù)設(shè)置了Binlog流讀取器,并在捕獲到任何異常時(shí)優(yōu)雅地關(guān)閉流。pandas
:將結(jié)果輸出到excel表格中,用于數(shù)據(jù)進(jìn)行分析處理。
4.運(yùn)行腳本
運(yùn)行這個(gè)Python腳本,它將連接到你的MySQL服務(wù)器,并開(kāi)始讀取Binlog中的事件。
每當(dāng)有新的事件發(fā)生時(shí)(如插入、更新或刪除操作),它都會(huì)打印出相應(yīng)的SQL語(yǔ)句。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL通過(guò)binlog實(shí)現(xiàn)恢復(fù)數(shù)據(jù)
- MySQL通過(guò)日志恢復(fù)數(shù)據(jù)的操作步驟
- MySQL通過(guò)ibd文件恢復(fù)數(shù)據(jù)的操作過(guò)程
- MySQL開(kāi)啟配置binlog及通過(guò)binlog恢復(fù)數(shù)據(jù)步驟詳析
- mysql binlog如何恢復(fù)數(shù)據(jù)到某一時(shí)刻
- MySQL誤刪后使用binlog恢復(fù)數(shù)據(jù)的實(shí)現(xiàn)方法
- mysql數(shù)據(jù)損壞,如何通過(guò)ibd和frm文件批量恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)
- Mysql如何通過(guò)ibd文件恢復(fù)數(shù)據(jù)
- mysql如何根據(jù).frm和.ibd文件恢復(fù)數(shù)據(jù)表
- 一步步教你如何使用mysql?binlog恢復(fù)數(shù)據(jù)
- MySql恢復(fù)數(shù)據(jù)方法梳理講解
- Mysql通過(guò)ibd文件恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- MySQL數(shù)據(jù)庫(kù)通過(guò)Binlog恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- Mysql如何通過(guò)binlog日志恢復(fù)數(shù)據(jù)詳解
- mysql5.7使用binlog 恢復(fù)數(shù)據(jù)的方法
- MySQL通過(guò)binlog恢復(fù)數(shù)據(jù)
- mysql8.0無(wú)備份通過(guò)idb文件恢復(fù)數(shù)據(jù)的方法、idb文件修復(fù)和tablespace?id不一致處理
相關(guān)文章
Python Playwright安裝和基本使用問(wèn)題記錄
這篇文章主要介紹了Playwright安裝和基本使用問(wèn)題記錄,playwright是一款新型的自動(dòng)化測(cè)試工具,功能非常強(qiáng)大,有很多優(yōu)點(diǎn),缺點(diǎn)就是使用的人比較少,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Python 管理依賴包工具pip, virtualenv詳解
管理依賴包是Python開(kāi)發(fā)中不可或缺的一部分,通過(guò)pip、virtualenv和pipenv等工具,我們可以有效地管理包和虛擬環(huán)境,確保項(xiàng)目的可移植性和一致性,這篇文章主要介紹了Python 管理依賴包(pip, virtualenv),需要的朋友可以參考下2024-07-07

python實(shí)現(xiàn)讀取excel寫(xiě)入mysql的小工具詳解

Python如何實(shí)現(xiàn)xml解析并輸出到Excel上

基于Python實(shí)現(xiàn)帕累托圖的示例詳解

Python基于回溯法子集樹(shù)模板解決全排列問(wèn)題示例

在PyCharm中遇到pip安裝 失敗問(wèn)題及解決方案(pip失效時(shí)的解決方案)