binlog2sql的使用

第1章 使用该工具的前提

1. binlog_format为ROW,且binlog_row_image为full或noblog,默认为full。2. 必须开启MySQL Server,理由有如下两点: 1> 它是基于BINLOG_DUMP协议来获取binlog内容 2> 需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句该工具所需权限如下:GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO .....因为是伪装成slave来获取主的二进制事件,故无需对binlog有可读权限。3. 不能回滚DDL语句(truncate,drop等操作)

第2章 安装部署流程

1.1 上传软件并解压

1. 上传2. unzip binlog2sql-fg.zip 

1.2 安装binsql2

cd binlog2sql/cd binlog2sql/#说明:里面有2个binlog2sql,所以进2层cd binlog2sql_dependencies/[root@db02 binlog2sql_dependencies]# tar xf setuptools-0.6c11.tar.gz [root@db02 binlog2sql_dependencies]# cd setuptools-0.6c11/[root@db02 setuptools-0.6c11]# python setup.py install[root@db02 setuptools-0.6c11]# cd ..[root@db02 binlog2sql_dependencies]# tar xf pip-9.0.1.tar.gz [root@db02 binlog2sql_dependencies]# cd pip-9.0.1/[root@db02 pip-9.0.1]# python setup.py install[root@db02 pip-9.0.1]# cd ..[root@db02 binlog2sql_dependencies]# pip install *.whl mysql-replication-0.9.tar.gz [root@db02 binlog2sql_dependencies]# cd ..[root@db02 binlog2sql]# lsbinlog2sql binlog2sql_dependencies[root@db02 binlog2sql]# cd binlog2sql[root@db02 binlog2sql]# lsbinlog2sql.py binlog2sql_util.py binlog2sql_util.pyc __init__.py#设置别名[root@db02 binlog2sql]# pwd/root/binlog2sql/binlog2sql/binlog2sql[root@db02 binlog2sql]# alias binlog2sql=‘python /root/binlog2sql/binlog2sql/binlog2sql/binlog2sql.py‘#检查[root@db02 binlog2sql]# binlog2sql --help#把别名加入环境变量,并使其及时生效[root@db02 ~]# vim /etc/profile--加入以下内容 alias binlog2sql=‘python /root/binlog2sql/binlog2sql/binlog2sql/binlog2sql.py‘ [root@db02 ~]# source /etc/profile

1.3 MySQL的配置要开启以下选项

[mysqld]server_id=1#二进制日志路劲log_bin=/data/binlog/mysql-binmax_binlog_size=1G#默认为行模式,可以写binlog_format=row#默认模式,可以不用写binlog_row_image=full

1.3 binlog2sql参数说明

[root@db02 binlog2sql]# binlog2sql --help选项mysql连接配置-h host; -P port; -u user; -p password解析模式--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。解析范围控制--start-file 起始解析文件,只需文件名,无需全路径 。必须。--start-position/--start-pos 起始解析位置。可选。默认为start-file的起始位置。--stop-file/--end-file 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。--stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。--start-datetime 起始解析时间,格式‘%Y-%m-%d %H:%M:%S‘。可选。默认不过滤。--stop-datetime 终止解析时间,格式‘%Y-%m-%d %H:%M:%S‘。可选。默认不过滤。对象过滤-d, --databases 只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空。-t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空。--only-dml 只解析dml,忽略ddl。可选。默认TRUE。--sql-type 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用空格隔开,如--sql-type INSERT DELETE。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。

第3章 binlog2sql的使用

1.1 模拟数据

create database yfc charset utf8mb4;use yfccreate table t1(id int,name varchar(10));insert into t1 values(1,‘aa‘),(2,‘bb‘),(3,‘cc‘),(4,‘dd‘);commit;delete from t1 where id<3;commit;select * from t1;+------+------+| id | name |+------+------+| 3 | cc || 4 | dd |+------+------+

1.2 恢复流程

第一个里程:查看binlog文件

show master status\Gmysql> show master status\G*************************** 1. row *************************** File: mysql-bin.000017 Position: 1803 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: be150990-174c-11ea-9182-000c29191628:1-441 row in set (0.00 sec)

第二个里程:根据操作时间定位误操作SQL的binlog位置

[root@db02 ~]# cd binlog2sql/binlog2sql/binlog2sql[root@db02 binlog2sql]# lsbinlog2sql.py binlog2sql_util.py binlog2sql_util.pyc __init__.py[root@db02 binlog2sql]# binlog2sql -h192.168.126.201 -P3306 -uflush -p123 -dyfc -tt1 --start-file=‘mysql-bin.000017‘ --start-datetime=‘2019-12-12 15:49:10‘ --stop-datetime=‘2019-12-12 15:51:10‘USE yfc;drop database yfc;USE yfc;create database yfc charset utf8mb4;USE yfc;create table t1(id int,name varchar(10));INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (1, ‘aa‘); #start 5805 end 5990 time 2019-12-12 15:49:47INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (2, ‘bb‘); #start 5805 end 5990 time 2019-12-12 15:49:47INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (3, ‘cc‘); #start 5805 end 5990 time 2019-12-12 15:49:47INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (4, ‘dd‘); #start 5805 end 5990 time 2019-12-12 15:49:47DELETE FROM `yfc`.`t1` WHERE `id`=1 AND `name`=‘aa‘ LIMIT 1; #start 6086 end 6255 time 2019-12-12 15:49:47DELETE FROM `yfc`.`t1` WHERE `id`=2 AND `name`=‘bb‘ LIMIT 1; #start 6086 end 6255 time 2019-12-12 15:49:47

第三个里程:从结果找至误操作的位置为6086-6255之间,生成回滚sql

[root@db02 binlog2sql]# binlog2sql -h192.168.126.201 -P3306 -uflush -p123 -dyfc -tt1 --start-file=‘mysql-bin.000017‘ --start-position=6086 --stop-position=6255 -B >/tmp/2.sql[root@db02 binlog2sql]# cat /tmp/2.sql INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (2, ‘bb‘); #start 6086 end 6255 time 2019-12-12 15:49:47INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (1, ‘aa‘); #start 6086 end 6255 time 2019-12-12 15:49:47

第四个里程:编辑回滚SQL文件

[root@db02 binlog2sql]# vim /tmp/2.sql#加入commit,因为这是已经提交的数据,如果是没有提交的数据,可以不用编辑

第五个里程:闪回恢复数据

mysql> use yfcmysql>source /tmp/2.sql

第六个里程:查看数据是否恢复了

mysql> select * from t1;+------+------+| id | name |+------+------+| 3 | cc || 4 | dd || 2 | bb || 1 | aa |+------+------+4 rows in set (0.00 sec)

相关文章