1. 程式人生 > 實用技巧 >binlog2sql安裝及用法簡介

binlog2sql安裝及用法簡介

我的版本說明

MySQL:8.0.20
Python:3.69

這裡一定要注意!!!pymysql必須是這個版本 pip install PyMySQL==0.9.3

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)如果只回滾某張表,並且該表有關聯表,關聯表並不會被回滾,需與業務方溝通清楚。