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]# ls
binlog2sql  binlog2sql_dependencies
[root@db02 binlog2sql]# cd binlog2sql
[root@db02 binlog2sql]# ls
binlog2sql.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-bin
max_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 yfc
create 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\G
mysql> 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-44
1 row in set (0.00 sec)

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

[root@db02 ~]# cd binlog2sql/binlog2sql/binlog2sql
[root@db02 binlog2sql]# ls
binlog2sql.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:47
INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (2, 'bb'); #start 5805 end 5990 time 2019-12-12 15:49:47
INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (3, 'cc'); #start 5805 end 5990 time 2019-12-12 15:49:47
INSERT INTO `yfc`.`t1`(`id`, `name`) VALUES (4, 'dd'); #start 5805 end 5990 time 2019-12-12 15:49:47
DELETE FROM `yfc`.`t1` WHERE `id`=1 AND `name`='aa' LIMIT 1; #start 6086 end 6255 time 2019-12-12 15:49:47
DELETE 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:47
INSERT 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 yfc
mysql>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)

猜你喜欢

转载自www.cnblogs.com/yufenchi/p/12961765.html