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

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

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

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