Mysql误操作后使用binlog2sql快速回滚

Mysql误操作后使用binlog2sql快速回滚
一、binlog2sql安装
从mysql binlog解析出你要的sql。根据不同选项,你可以得到原始sql、回滚sql、去除主键的insert sql等。
1.1、用途
数据快速回滚(闪回)
主从切换后数据不一致的修复
从binlog生成标准SQL,带来的衍生功能
1.2、安装
[root@foidndb ~]# cd /usr/local/
[root@foidndb local]# git clone git://github.com/danfengcao/binlog2sql.git

[root@foidndb binlog2sql]# pip install -r requirements.txt

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

[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full



2.3 user需要的最小权限集合
select, super/replication client, replication slave权限
建议授权:
mysql > grant select,replication slave,replication client on *.* to flashback@'localhost' identified by 'Shiyu!520';
mysql > grant select,replication slave,replication client on *.* to flashback@'127.0.0.1' identified by 'Shiyu!520';

2.4基本用法
解析出标准SQL

shell> python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -ddatabase -t table1 table2 --start-file='mysql-bin.000040' --start-datetime='2018-07-09 18:30:00' --stop-datetime='2018-07-09 18:40:00' --start-pos=1240

解析出回滚SQL

shell> python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttest3 --start-file='mysql-bin.000040' --start-position=763 --stop-position=1147

三、测试
3.1 新建表test
mysql> create table yuhuashi(id int,name varchar(10));
Query OK, 0 rows affected (0.26 sec)

mysql> insert into yuhuashi values(1,'s');
Query OK, 1 row affected (0.06 sec)

mysql> insert into yuhuashi values(2,'h');
Query OK, 1 row affected (0.06 sec)

mysql> insert into yuhuashi values(3,'i');
Query OK, 1 row affected (0.05 sec)

mysql> insert into yuhuashi values(4,'y');
Query OK, 1 row affected (0.07 sec)

mysql> insert into yuhuashi values(5,'u');
Query OK, 1 row affected (0.06 sec)

mysql> select * from yuhuashi;
+------+------+
| id   | name |
+------+------+
|    1 | s    |
|    2 | h    |
|    3 | i    |
|    4 | y    |
|    5 | u    |
+------+------+
5 rows in set (0.00 sec)

停个5分钟以后执行一下命令:

mysql> delete from yuhuashi where id>=3;
Query OK, 3 rows affected (0.05 sec)


3.2 解析标准sql
[root@foidndb ~]# python /usr/local/binlog2sql/binlog2sql/binlog2sql.py -uflashback -pShiyu'!'520 -dmonitor -tyuhuashi --start-file='mysql-bin.000040' --start-datetime='2018-07-09 17:16:00' --stop-datetime='2018-07-09 17:19:00' > yuhuashi.sql
[root@foidndb ~]# cat yuhuashi.sql
DELETE FROM `monitor`.`yuhuashi` WHERE `id`=3 AND `name`='i' LIMIT 1; #start 25735066 end 25735319 time 2018-07-09 17:18:14
DELETE FROM `monitor`.`yuhuashi` WHERE `id`=4 AND `name`='y' LIMIT 1; #start 25735066 end 25735319 time 2018-07-09 17:18:14
DELETE FROM `monitor`.`yuhuashi` WHERE `id`=5 AND `name`='u' LIMIT 1; #start 25735066 end 25735319 time 2018-07-09 17:18:14

3.3 解析出回滚SQL
[root@foidndb ~]# python /usr/local/binlog2sql/binlog2sql/binlog2sql.py -uflashback -pShiyu'!'520 -dmonitor -tyuhuashi --start-file='mysql-bin.000040' --start-datetime='2018-07-09 17:16:00' --stop-datetime='2018-07-09 17:19:00' -B >rollback.sql
[root@foidndb ~]# cat rollback.sql
INSERT INTO `monitor`.`yuhuashi`(`id`, `name`) VALUES (5, 'u'); #start 25735066 end 25735319 time 2018-07-09 17:18:14
INSERT INTO `monitor`.`yuhuashi`(`id`, `name`) VALUES (4, 'y'); #start 25735066 end 25735319 time 2018-07-09 17:18:14
INSERT INTO `monitor`.`yuhuashi`(`id`, `name`) VALUES (3, 'i'); #start 25735066 end 25735319 time 2018-07-09 17:18:14

mysql连接配置
   -h host; -P port; -u user; -p password
解析模式
  --realtime 持续同步binlog。可选。不加则同步至执行命令时最新的binlog位置。
  --popPk 对INSERT语句去除主键。可选。
  -B, --flashback 生成回滚语句。可选。与realtime或popPk不能同时添加。
解析范围控制
  --start-file 起始解析文件。必须。
  --start-pos start-file的起始解析位置。可选。默认为start-file的起始位置;
  --end-file 末尾解析文件。可选。默认为start-file同一个文件。若解析模式为realtime,此选项失效。
  --end-pos end-file的末尾解析位置。可选。默认为end-file的最末位置;若解析模式为realtime,此选项失效。
对象过滤
   -d, --databases 只输出目标db的sql。可选。默认为空。
   -t, --tables 只输出目标tables的sql。可选。默认为空。
   
   
3.4、开始回滚
[root@foidndb ~]# mysql -u root -p < rollback.sql
Enter password:
3.5登录数据库验证
 mysql> select * from yuhuashi;
+------+------+
| id   | name |
+------+------+
|    1 | s    |
|    2 | h    |
|    5 | u    |
|    4 | y    |
|    3 | i    |
+------+------+
5 rows in set (0.00 sec)
四 、注意事项

4.1、在配置文件中设置了以下参数:
server_id = 1
log_bin = /data/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full # 默认

4.2、在闪回的时候必须启动 MySQL 服务

因为它是通过 BINLOG_DUMP 协议来获取 binlog 内容,需要读取server端 information_schema.COLUMNS 表,来获取表结构的元信息,才能拼接成 SQL 语句。因此需要给用户提供的最小权限如下:
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user'@'%';
源码中,主要是使用 python-mysql-replication 作为实时解析 MySQL binlog 来获取各个 EVENT。
python-mysql-replication 实现了 MySQL 复制协议,客户端伪装成 slave 来获取主的 binlog 和 EVENT。

4.3、insert、update、delete大部分时候可以解析出来标准sql和回滚sql

一种情况例外:insert、updete、delete操作之后,drop/truncate table。 此时虽然在binlog中记录了所有的event,但是使用binlog2sql生成标准sql、回滚sql的时候已经找不到了dml操作的相应的表

4.4、DDL无法使用binlog2sql闪回数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨花石~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值