博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql误操作后使用binlog2sql快速回滚
阅读量:4070 次
发布时间:2019-05-25

本文共 4708 字,大约阅读时间需要 15 分钟。

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闪回数据。

转载地址:http://bchji.baihongyu.com/

你可能感兴趣的文章
SQL语句(二)查询语句
查看>>
SQL语句(六) 自主存取控制
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
堆排序完整版,含注释
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
PostgreSQL代码分析,查询优化部分,process_duplicate_ors
查看>>
PostgreSQL代码分析,查询优化部分,canonicalize_qual
查看>>
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
查看>>
ORACLE权限管理调研笔记
查看>>
移进规约冲突一例
查看>>
IA32时钟周期的一些内容
查看>>
SM2椭圆曲线公钥密码算法
查看>>
获得github工程中的一个文件夹的方法
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>
PostgreSQL查询优化器详解之逻辑优化篇
查看>>
STM32中assert_param的使用
查看>>
C语言中的 (void*)0 与 (void)0
查看>>
vu 是什么
查看>>
io口的作用
查看>>