Python MySQL如何通過Binlog獲取變更記錄恢復(fù)數(shù)據(jù)
Python MySQL通過Binlog獲取變更記錄恢復(fù)數(shù)據(jù)
通過MySQL的二進(jìn)制日志(Binlog)獲取數(shù)據(jù)庫的變更記錄,并用于恢復(fù)數(shù)據(jù),是一個(gè)相對(duì)高級(jí)的操作。
這通常涉及讀取Binlog中的事件,解析這些事件以了解數(shù)據(jù)變更的詳細(xì)信息,然后基于這些信息來恢復(fù)或回滾數(shù)據(jù)。
在Python中,你可以使用pymysqlreplication庫來讀取Binlog,但請(qǐng)注意,這個(gè)庫本身并不提供直接的數(shù)據(jù)恢復(fù)功能。它只能幫助你解析Binlog中的事件?;謴?fù)數(shù)據(jù)需要你根據(jù)這些事件編寫額外的邏輯。
以下是一個(gè)使用pymysqlreplication庫通過Binlog獲取MySQL操作記錄的示例:
1.安裝pymysqlreplication
首先,你需要安裝這個(gè)庫。你可以使用pip來安裝:
pip install pymysqlreplication
2.配置MySQL
確保你的MySQL服務(wù)器啟用了Binlog,并且你有一個(gè)具有足夠權(quán)限的MySQL用戶來讀取Binlog。
3.編寫Python腳本
下面是一個(gè)簡(jiǎn)單的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服務(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(指定我們感興趣的事件類型)。stream:函數(shù)根據(jù)事件的類型(刪除、更新或插入)打印出相應(yīng)的SQL語句。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ù)器,并開始讀取Binlog中的事件。
每當(dāng)有新的事件發(fā)生時(shí)(如插入、更新或刪除操作),它都會(huì)打印出相應(yīng)的SQL語句。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL通過binlog實(shí)現(xiàn)恢復(fù)數(shù)據(jù)
- MySQL通過日志恢復(fù)數(shù)據(jù)的操作步驟
- MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程
- MySQL開啟配置binlog及通過binlog恢復(fù)數(shù)據(jù)步驟詳析
- mysql binlog如何恢復(fù)數(shù)據(jù)到某一時(shí)刻
- MySQL誤刪后使用binlog恢復(fù)數(shù)據(jù)的實(shí)現(xiàn)方法
- mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)
- Mysql如何通過ibd文件恢復(fù)數(shù)據(jù)
- mysql如何根據(jù).frm和.ibd文件恢復(fù)數(shù)據(jù)表
- 一步步教你如何使用mysql?binlog恢復(fù)數(shù)據(jù)
- MySql恢復(fù)數(shù)據(jù)方法梳理講解
- Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- MySQL數(shù)據(jù)庫通過Binlog恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- Mysql如何通過binlog日志恢復(fù)數(shù)據(jù)詳解
- mysql5.7使用binlog 恢復(fù)數(shù)據(jù)的方法
- MySQL通過binlog恢復(fù)數(shù)據(jù)
- mysql8.0無備份通過idb文件恢復(fù)數(shù)據(jù)的方法、idb文件修復(fù)和tablespace?id不一致處理
相關(guān)文章
Python機(jī)器學(xué)習(xí)特征重要性分析的8個(gè)常用方法實(shí)例探究
本文詳細(xì)介紹8種常用的方法,涵蓋了基于決策樹、集成學(xué)習(xí)模型以及統(tǒng)計(jì)學(xué)方法的特征重要性分析,從決策樹模型到SHAP值,深入探討每種方法的原理和示例,幫助全面了解如何評(píng)估特征的重要性,將能更好地理解特征對(duì)模型預(yù)測(cè)的貢獻(xiàn),為提升模型性能和解釋模型決策提供有力支持2024-01-01
Python機(jī)器學(xué)習(xí)NLP自然語言處理基本操作之京東評(píng)論分類
自然語言處理( Natural Language Processing, NLP)是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要方向。它研究能實(shí)現(xiàn)人與計(jì)算機(jī)之間用自然語言進(jìn)行有效通信的各種理論和方法2021-10-10
全面掌握Python?JSON庫函數(shù)與方法學(xué)會(huì)JSON數(shù)據(jù)處理
Python提供了內(nèi)置的JSON庫,允許在Python中解析和序列化JSON數(shù)據(jù),本文將深入研究Python中JSON庫的各種函數(shù)和方法,為你提供豐富的示例代碼來幫助掌握J(rèn)SON處理的方方面面2024-01-01
python 日志模塊logging的使用場(chǎng)景及示例
這篇文章主要介紹了python 日志模塊logging的使用場(chǎng)景及示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01

