生产上误删数据、误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成本也大。

当然还有其他的一些操作方法,我们今天有主角。

MySQL 闪回工具 --   binlog2sql

用途

  • 数据回滚
  • 主从切换后数据不一致的修复
  • 从 binlog 生成标准 SQL,带来的衍生功能

闪回原理简析

开始之前,先说说闪回。我们都知道 MySQL binlog 以 event 为单位,记录数据库的变更信息,这些信息能够帮助我们重现这之间的所有变化,也就是所谓的闪回。

binlog 有三种可选的格式:

  • statement:基于 SQL 语句的模式,binlog 数据量小,但是某些语句和函数在复制过程可能导致数据不一致甚至出错;
  • mixed:混合模式,根据语句来选用是 statement 还是 row 模式;
  • row:基于行的模式,记录的是行的完整变化。安全,但 binlog 会比其他两种模式大很多;

利用 binlog 做闪回,需要将 binlog 格式设置为 row,因为我们需要最详尽的信息来确定操作之后数据不会出错。

既然 binlog 以 event 形式记录了所有的变更信息,那么我们把需要回滚的 event,从后往前回滚回去即可。

回滚操作:对于 delete 操作,我们从 binlog 提取出 delete 信息,反向生成 insert 回滚语句;
对于 insert 操作,反向生成 delete 回滚语句;
对于 update 操作,根据信息生成反向的 update 语句;

竟然这么厉害??

来实例演习下

主要测试 DML,也就是 delete、update、insert 等操作的闪回效果。

但是,DDL 语句,比如drop,truncate 在整个使用中都是无法被回滚的,这种情况,只能用最近的备份数据+二进制日志恢复

本次实验,更改一条数据,并删除一条数据,然后从解析 binlog 信息,到使用 binlog2sql 工具来生成标准和回滚 SQL,来剖析整个运行过程。

一、准备工作

1.确定版本信息和binlog格式

mysql版本:5.7.12

查看binlog格式的命令

mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+

2.安装binlog2sql工具     #(随便安装在合适的服务器即可,比如我在内网15安装了一个)

安装参考链接:http://note.youdao.com/noteshare?id=85a90269a21d877962bfce0dfa40a90b&sub=71CD3E637F534AA1AFF129563F6A064E

3.在mysql的主服务器上,创建闪回操作账号的权限

mysql>   GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'glon'@'%'  identified by '123456';mysql> show grants for 'glon'@'%';
+--------------------------------------------------------------------------+
| Grants for glon@% |
+--------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'glon'@'%' |
+--------------------------------------------------------------------------+
1 row in set (0.00 sec)

4.初始化数据

CREATE TABLE `edai_binlog2sql` (`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8insert into edai_binlog2sql (name,create_time) values ('Glon Ho','2012-10-1'),('Eason Chan', '2016-05-02'),('Jacky Cheung', '2015-05-02');mysql> select * from edai_binlog2sql;
+----+--------------+---------------------+
| id | name | create_time |
+----+--------------+---------------------+
| 4 | Glon Ho | 2012-10-01 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
| 6 | Jacky Cheung | 2015-05-02 00:00:00 |
+----+--------------+---------------------+
3 rows in set (0.00 sec)

  • 进行 update 和 delete 操作
mysql> update edai_binlog2sql set create_time = '2017-05-12' where name = 'Glon Ho';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from edai_binlog2sql;
+----+--------------+---------------------+
| id | name | create_time |
+----+--------------+---------------------+
| 4 | Glon Ho | 2017-05-12 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
| 6 | Jacky Cheung | 2015-05-02 00:00:00 |
+----+--------------+---------------------+
3 rows in set (0.00 sec)mysql> delete from edai_binlog2sql where name = 'Jacky Cheung';
Query OK, 1 row affected (0.09 sec)mysql> select * from edai_binlog2sql;
+----+------------+---------------------+
| id | name | create_time |
+----+------------+---------------------+
| 4 | Glon Ho | 2017-05-12 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
+----+------------+---------------------+
2 rows in set (0.00 sec)
操作时候,Glon Ho 的时间改变了,而 Jacky Cheung 也被删除了。

我们来看下mysql的binlog文件位置

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 6159854 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 

好的,接下来使用binlog2sql工具   #这个工具我们安装在15服务器上的,我们去15上操作

1)解析出标准的SQL

python binlog2sql.py -h192.168.1.21 -P30136 -uglon -p'123456' -d xcrm -t edai_binlog2sql  --start-file=mysql-bin.000001 > edai_binlog2sql.sql

参数解释:-h:数据库服务地址-u:连接用户名
-p:密码-P:端口
-d:数据库名
-t:表名 --start-file: 通俗的来讲就是,要解析sql的所在的binglog文件--flashback: 闪回,逆向解析sql语句

cat edai_binlog2sql.sql

可以看到,几乎完美重现了我们上面执行过的 SQL,而且生成的每个 SQL 后面都带有该语句在 binlog 中的 position 信息和该语句的执行时间

2)解析想要回滚的SQL

比如,我想回滚刚刚操作的,edai_binlog2sql 后面两个update和DELETE操作

找到的时间节点就是:start 6159262   end 6159823    #分析最好用pos分析,这个可以更准确的定位到想要的

python binlog2sql.py  --flashback  -h192.168.1.21 -P30136 -uglon -p'123456' -dxcrm -tedai_binlog2sql --start-file=mysql-bin.000001 --start-position=6159262    --stop-pos=6159823 > edai_binlog2sql-new.sql

[root@soft binlog2sql]# cat edai_binlog2sql-new.sql
INSERT INTO `xcrm`.`edai_binlog2sql`(`create_time`, `id`, `name`) VALUES ('2015-05-02 00:00:00', 6, 'Jacky Cheung'); #start 6159565 end 6159823 time 2018-11-22 15:16:30
UPDATE `xcrm`.`edai_binlog2sql` SET `create_time`='2012-10-01 00:00:00', `id`=4, `name`='Glon Ho' WHERE `create_time`='2017-05-12 00:00:00' AND `id`=4 AND `name`='Glon Ho' LIMIT 1; #start 6159262 end 6159534 time 2018-11-22 15:15:46

可以看到,我们刚刚的delete语句,被反转为insert语句,update 修改为原来的时间

拿到了具体的恢复语句

那我们拿去数据库执行吧

好了,完美搞定

转载于:https://www.cnblogs.com/tianfen/p/10001807.html

Mysql闪回工具之binlog2sql的原理及其使用相关推荐

  1. mysql闪回工具下载_MySQL闪回工具之myflash 和 binlog2sql

    实践 利用binlog2sql查询两个binlog之间的SQL:必须是两个binlog日志,指定start-file和stop-file binlog2sql -h127.0.0.1 -P3309 - ...

  2. MyFlash——美团点评的开源MySQL闪回工具

    由于运维.DBA的误操作或是业务bug,我们在操作中时不时会出现误删除数据情况.早期要想恢复数据,只能让业务人员根据线上操作日志,构造误删除的数据,或者DBA使用binlog和备份的方式恢复数据,不管 ...

  3. 美团mysql 闪回_MyFlash——美团点评的开源MySQL闪回工具

    由于运维.DBA的误操作或是业务bug,我们在操作中时不时会出现误删除数据情况.早期要想恢复数据,只能让业务人员根据线上操作日志,构造误删除的数据,或者DBA使用binlog和备份的方式恢复数据,不管 ...

  4. mysql 闪回_MySQL数据误删除的快速解决方法(MySQL闪回工具)

    概述 Binlog2sql是一个Python开发开源的MySQL Binlog解析工具,能够将Binlog解析为原始的SQL,也支持将Binlog解析为回滚的SQL,去除主键的INSERT SQL,是 ...

  5. mysql binlog2sql_mysql闪回工具binlog2sql安装配置教程详解

    概述 binlog2sql是一个Python开发开源的MySQL Binlog解析工具,能够将Binlog解析为原始的SQL,也支持将Binlog解析为回滚的SQL,去除主键的INSERT SQL,是 ...

  6. MySQL数据闪回工具

    文章目录 一. MySQL闪回工具 1.1 binlog2sql 1.2 MyFlash 二.总结 一. MySQL闪回工具 1.1 binlog2sql binlog2sql安装包及依赖包 asn1 ...

  7. 程序猿必知的MySQL闪回原理

    详细参见https://blog.csdn.net/qq_32506555/article/details/54426440 DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就 ...

  8. MySQL闪回原理与实战

    文章来源 https://github.com/danfengcao/binlog2sql https://github.com/danfengcao/binlog2sql/blob/master/e ...

  9. MySQL 闪回原理与实战

    DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...

最新文章

  1. [Android]webview直接加载网页允许JS,进度条,当前应用内跳转
  2. 正确使用stl vecotr erase函数
  3. 产品设计技术公开-一种扼杀对手的方式
  4. MySQL HAVING:指定过滤条件
  5. VMware vSphere 4.1虚拟化学习手册6:Distributed vSwitch分布式交换机
  6. 前端学习(499):水平居中布局得第一种方式得优点和缺点
  7. 手机端java编辑器验证正确_java – 使用编辑器验证表的单元格
  8. sizeof(class)分析
  9. 解决JS拖拽出现的问题
  10. Linux MySQL主主复制(Replication)(MySQL数据双向同步)配置
  11. C# Winform编程ListBox之DrawItem事件
  12. BZOJ2151 种树
  13. 数字图像处理第三版4.8.4例子GLPF高斯低通滤波器matlab程序
  14. SPSS22 高级市场分析 统计分析【原创】
  15. hive分隔符_hive默认分隔符
  16. “该内存不能为读写”解决方法
  17. 系分架构 - 软件架构设计
  18. 【TDA2x学习】3、软件架构分析
  19. 三类机构舆情-2019年3月5日
  20. 也许孤独是冥冥中的命中注定

热门文章

  1. 初识C++之函数重载
  2. 广播 消息 没有服务器,服务器节点消息广播
  3. java空心字木塔_我国七个千年古塔:第四个空心没有塔顶,最后一个是木塔无钉无铆...
  4. linux上的定时器上的jiffies,Linux kernel -- 定时器/jiffies
  5. 学校计算机 电教材料账册,电教室管理制度
  6. 手工编程是指利用计算机完成,西安交通大学17年3月课程考试《CAD CAM》作业考核试题...
  7. 读保护_混合ASIL系统中不同安全等级模块间的边界保护
  8. php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...
  9. Android打开谷歌应用,谷歌确认 Android 12 新增剪贴板访问提醒,将在 Beta 2 上线
  10. c#二叉树 取叶子节点个数_两种类似但是原理不同的算法求二叉树的所有叶子节点和...