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)如果只回滚某张表,并且该表有关联表,关联表并不会被回滚,需与业务方沟通清楚。
原文地址:https://www.cnblogs.com/any-way/p/14184300.html