MySQL數據閃回工具

一、 MySQL閃回工具

1.1 binlog2sql

binlog2sql安裝包及依賴包

asn1crypto-master.zip cairocffi-master.zip cryptography-master.zip ipaddress-master.zip pycparser-master.zip PyMySQL-master.zip setuptools-40.6.2.zip binlog2sql-master.zip cffi-1.11.5.tar.gz enum34-master.zip pip-18.1.tar.gz  python-mysql-replication-master.zip wheel-0.32.3.tar.gz

使用要求

#my.cnf參數設置
server_id = 33061
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
用戶最小權限:select,super,replication client,replication slave 
* select:需要讀取server端information_schema.COLUMNS表,獲取表結構的元信息,拼接成可視化的sql語句 
* super/replication client:兩個權限都可以,需要執行'SHOW MASTER STATUS', 獲取server端的binlog列表 
* replication slave:通過BINLOG_DUMP協議獲取binlog內容的權限

基本用法

解析出標準SQL:python binlog2sql.py -h -P -u -p -d -t  --start-file= --start-position=
解析出回滾SQL:python binlog2sql.py -h -P -u -p -d -t  --start-file= --start-position=  -B
**命令選項**
mysql連接配置:-h host; -P port; -u user; -p password
**解析模式 **
* --stop-never 持續同步binlog。可選。不加則同步至執行命令時最新的binlog位置。 
* -K, --no-primary-key 對INSERT語句去除主鍵。可選。 
* -B, --flashback 生成回滾語句,可解析大文件,不受內存限制,每打印一千行加一句SLEEP SELECT(1)。可選。與stop-never或no-primary-key不能同時添加。
**解析範圍控制**
* --start-file 起始解析文件。必須。 
* --start-position/--start-pos start-file的起始解析位置。可選。默認爲start-file的起始位置。 
* --stop-file/--end-file 末尾解析文件。可選。默認爲start-file同一個文件。若解析模式爲stop-never,此選項失效。 
* --stop-position/--end-pos stop-file的末尾解析位置。可選。默認爲stop-file的最末位置;若解析模式爲stop-never,此選項失效。 
* --start-datetime 從哪個時間點的binlog開始解析,格式必須爲datetime,如'2016-11-11 11:11:11'。可選。默認不過濾。 
* --stop-datetime 到哪個時間點的binlog停止解析,格式必須爲datetime,如'2016-11-11 11:11:11'。可選。默認不過濾。
**對象過濾**
* -d, --databases 只輸出目標db的sql。可選。默認爲空。 
* -t, --tables 只輸出目標tables的sql。可選。默認爲空。

注意點

* 閃回的目標:快速篩選出真正需要回滾的數據。
* 先根據庫、表、時間做一次過濾,再根據位置做更準確的過濾。
* 由於數據一直在寫入,要確保回滾sql中不包含其他數據。可根據是否是同一事務、誤操作行數、字段值的特徵等等來幫助判斷。
* 如果只回滾某張表,並且該表有關聯表,關聯表並不會被回滾,需與業務方溝通清楚。
* 哪些數據需要回滾,讓業務方來判斷!

1.2 MyFlash

參數

全部參數請通過--help查看,以下只列舉部分常用參數。
databaseNames
指定需要回滾的數據庫名。多個數據庫可以用“,”隔開。如果不指定該參數,相當於指定了所有數據庫。
tableNames
指定需要回滾的表名。多個表可以用“,”隔開。如果不指定該參數,相當於指定了所有表。
start-datetime
指定回滾的開始時間。注意格式必須是 %Y-%m-%d %H:%M:%S。 如不指定,則不限定時間
stop-datetime
指定回滾的結束時間。注意格式必須是 %Y-%m-%d %H:%M:%S。 如不指定,則不限定時間
sqlTypes
指定需要回滾的sql類型。目前支持的過濾類型是INSERT, UPDATE ,DELETE。多個類型可以用“,”隔開。
binlogFileNames
指定需要回滾的binlog文件,目前只支持單個文件,後續會增加多個文件支持。
outBinlogFileNameBase
指定輸出的binlog文件前綴,如不指定,則默認爲binlog_output_base.flashback。

示例

回滾bin.000009中,所有與Messages_Center 表上delete操作有關的SQL,時間爲‘2018-04-17 15:00:00‘ 之後。
1.過濾並重新生成回滾二進制日誌
./flashback --databaseNames stdzwfw9release --tableNames Messages_Center --start-datetime 2018-04-17 15:00:00 --sqlTypes DELETE --binlogFileName bin.000009
2.應用生成的回滾日誌
mysqlbinlog binlog_output_base.flashback | mysql -h<host> -u<user> -p

二、總結

  對於MySQL來講,數據閃回的方式一共有以下幾種:

  • mysqlbinlog工具配合sed、awk。該方式先將binlog解析成類SQL的文本,然後使用sed、awk把類SQL文本轉換成真正的SQL。但是該方式在SQL語句複雜的時候存在出錯概率。
  • 使用binlog2sql成熟工具,但是binlog2sql工具過濾選項支持較差,需要結合awk、sed等工具進行篩選,並且依賴MySQL server。
  • 使用MyFlash工具,MyFlash不依賴於MySQL Server,過濾性好,但是解析出來的依舊爲binlog文件,易讀性差,業務確定不方便,需要用mysqlbinlog配合解決。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章