binlog2sql安裝及用法簡介


我的版本說明

MySQL:8.0.20
Python:3.69

這里一定要注意!!!pymysql必須是這個版本 pip install PyMySQL==0.9.3
GitHub地址:https://github.com/danfengcao/binlog2sql

1. binlog2sql功能簡介

(1)從binlog生成標准SQL
(2)數據快速回滾(閃回)

2. binlog2sql安裝

shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
shell> pip install -r requirements.txt

3. binlog2sql使用

MySQL server必須設置以下參數:

[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

user需要的最小權限集合:

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 

4. 參數選項簡介

-B, --flashback 生成回滾語句
--start-file 需要解析的binlog文件
--start-position 解析binlog的起始位置
--stop-position解析binlog的結束位置
--start-datetime 從哪個時間點的binlog開始解析,格式必須為datetime
--stop-datetime 到哪個時間點的binlog停止解析,格式必須為datetime
-d, --databases 只解析目標db的sql,多個庫用空格隔開,如-d db1 db2,可選,默認為空。
-t, --tables 只解析目標table的sql,多張表用空格隔開,如-t tbl1 tbl2,可選,默認為空。
--only-dml 只解析dml,忽略ddl。可選。默認False。
--sql-type 只解析指定類型,支持INSERT, UPDATE, DELETE。多個類型用空格隔開,如--sql-type INSERT DELETE。可選。默認為增刪改都解析。用了此參數但沒填任何類型,則三者都不解析。

4.1 解析模式

--stop-never 持續解析binlog。可選。默認False,同步至執行命令時最新的binlog位置。
-K, --no-primary-key 對INSERT語句去除主鍵。可選。默認False
-B, --flashback 生成回滾SQL,可解析大文件,不受內存限制。可選。默認False。與stop-never或no-primary-key不能同時添加。
--back-interval -B模式下,每打印一千行回滾SQL,加一句SLEEP多少秒,如不想加SLEEP,請設為0。可選。默認1.0。

5. 具體使用舉例

db:zxw table:t3

row格式binlog插入id=1記錄

利用binlog2sql生成剛才操作的解析

python3 binlog2sql.py -hxx -P3307 -uadmin -p'xx' -d'zxw' -t't3' --start-file='binlog.000002'

生成的文本顯示:

USE b'zxw';
create  table  t3(id int);
INSERT INTO `zxw`.`t3`(`id`) VALUES (1); #start 463 end 624 time 2020-12-24 07:39:27
INSERT INTO `zxw`.`t3`(`id`) VALUES (2); #start 734 end 895 time 2020-12-24 07:39:29
INSERT INTO `zxw`.`t3`(`id`) VALUES (3); #start 1005 end 1166 time 2020-12-24 07:39:33

生成回滾語句,加上-B參數:

python3 binlog2sql.py -hxx -P3307 -uadmin -p'xx' -d'zxw' -t't3' -B --start-file='binlog.000002'

生成的文本顯示:

DELETE FROM `zxw`.`t3` WHERE `id`=3 LIMIT 1; #start 1005 end 1166 time 2020-12-24 07:39:33
DELETE FROM `zxw`.`t3` WHERE `id`=2 LIMIT 1; #start 734 end 895 time 2020-12-24 07:39:29
DELETE FROM `zxw`.`t3` WHERE `id`=1 LIMIT 1; #start 463 end 624 time 2020-12-24 07:39:27

應用生成的回滾SQL

mysql -hxx -P3307 -uadmin -p'xx' zxw < rollback.sql

查看此時表中數據

mysql> select  *  from t3;
Empty set (0.00 sec)

補充:根據position點生成指定的范圍binlog的語句:

python3  binlog2sql.py  -h172.28.131.234 -P3307  -uadmin -p'admin' -d'zxw'  -t't3'   --start-file='binlog.000002'  --start-position=463  --stop-position=895

6. TIPS

(1)閃回的目標:快速篩選出真正需要回滾的數據;
(2)先根據庫、表、時間做一次過濾,再根據位置做更准確的過濾;
(3)由於數據一直在寫入,要確保回滾sql中不包含其他數據。可根據是否是同一事務、誤操作行數、字段值的特征等等來幫助判斷;
(4)執行回滾sql時如有報錯,需要查實具體原因,一般是因為對應的數據已發生變化。由於是嚴格的行模式,只要有唯一鍵(包括主鍵)存在,就只會報某條數據不存在的錯,不必擔心會更新不該操作的數據。業務如果有特殊邏輯,數據回滾可能會帶來影響;
(5)如果只回滾某張表,並且該表有關聯表,關聯表並不會被回滾,需與業務方溝通清楚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM