binlog2sql安裝及用法簡介
阿新 • • 發佈:2020-12-24
我的版本說明
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)如果只回滾某張表,並且該表有關聯表,關聯表並不會被回滾,需與業務方溝通清楚。