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