一.原理及其使用

生产上误删数据、误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成本也大。当然还有其他的一些操作方法,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工具

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'@'%' |
+--------------------------------------------------------------------------+

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=utf8 insert 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 |
+----+--------------+---------------------+
rows in set (0.00 sec)
  • 进行 update 和 delete 操作

    mysql> update edai_binlog2sql set create_time = '2017-05-12' where name = 'Glon Ho';

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 |
| 6 | Jacky Cheung | 2015-05-02 00:00:00 |
+----+--------------+---------------------+
rows in set (0.00 sec)

mysql> delete from edai_binlog2sql where name = 'Jacky Cheung';

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 |
+----+------------+---------------------+
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 | | | |
+------------------+----------+--------------+------------------+-------------------+
row in set (0.00 sec)

接下来使用binlog2sql工具

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 修改为原来的时间

拿到了具体的恢复语句,那我们拿去数据库执行吧

数据恢复binlog2sql的更多相关文章

  1. 使用binlog2sql做数据恢复的简单示例

    有时我们会遇到操作人员误删或者误更新数据的情况,这时我们迫切希望把原来的数据还原回来,今天我们介绍一个简单的工具来方便的实现此功能. 前提条件 在实现数据恢复之前,需要我们的MySQL满足以下配置条件 ...

  2. 使用binlog2sql针对mysql进行数据恢复

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

  3. binlog2sql数据恢复

    牛叉的工具有好几个,包括MyFlash.binlog2Sql.mysqlbinlog_flashback,还有一些收费的等等,各有优劣,具体使用可自行百度 1.安装binlog2sql shell&g ...

  4. binlog2sql之MySQL数据闪回实践

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

  5. mysql利用binlog进行数据恢复

    目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...

  6. binlog2sql的安装及使用

    binlog2sql是大众点评开源的一款用于解析binlog的工具,在测试环境试用了下,还不错. DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法 ...

  7. MySQL闪回工具之myflash 和 binlog2sql

    MySQL闪回工具之:binlog2sql  https://github.com/danfengcao/binlog2sql MYSQL Binglog分析利器:binlog2sql使用详解  :h ...

  8. mysql闪回工具--binlog2sql实践

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

  9. Binlog2sql+CentOS7 离线安装

    Binlog2sql+CentOS7 离线安装 目录 Binlog2sql+CentOS7 离线安装 1. 环境 2. 下载 3.1 Pip 安装 3.2 PyMySQL/mysql-replicat ...

随机推荐

  1. [Aizu2993]Invariant Tree

    若$(i,j)\in E$,实际上会不断推出$(p_{i},p_{j})\in E,(p_{p_{i}},p_{p_{j}})\in E,...$ 考虑将$i$向$p_{i}$连边得到了一张(由若干个 ...

  2. [hdu6973]Bookshop

    将询问拆成$x$​到$lca$​和$lca$​($lca$​靠近$y$​的儿子)到$y$​​两部分,分别处理(后者以前者的答案为基础) 两者是类似地,不妨仅考虑前者:用树剖将该询问拆成dfs序上若干个 ...

  3. 前端---梳理 http 知识体系 2

    为什么要有HTTPS HTTP 天生具有明文的特点,整个传输过程完全透明,任何人都能够在链路中截获.修改或者伪造请求 / 响应报文,数据不具有安全性.仅凭HTTP 自身是无法解决的,需要引入新的HTT ...

  4. SQL 跨实例操作

    SQL 跨实例操作 我使用的是 OpenDataSource 函数,假设你要在其他机器上访问 192.168.0.1 上的数据库: SELECT A.[Name], B.[SkillName], B. ...

  5. 洛谷 P5401 - [CTS2019]珍珠(NTT+二项式反演)

    题面传送门 一道多项式的 hot tea 首先考虑将题目的限制翻译成人话,我们记 \(c_i\) 为 \(i\) 的出现次数,那么题目的限制等价于 \(\sum\limits_{i=1}^D\lflo ...

  6. windows下的python安装pysam报错

    安装pysam时报错: 指定版本仍报错: 使用pysam-win安装: 但是import时不行: 貌似pysam在windows下难以正常配置,还是在Linux中用吧. https://www.jia ...

  7. 【机器学习与R语言】5-规则学习算法

    目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...

  8. 25-ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  9. 解决CentOS7 docker容器映射端口只监听ipv6的问题

    问题现象 docker容器起来以后,查看9100端口监听情况,如下图: $ ss -lntp State Recv-Q Send-Q Local Address:Port Peer Address:P ...

  10. 腾讯云联合中国信通院&作业帮等首发《降本之源-云原生成本管理白皮书》

    在11月4日举办的2021腾讯数字生态大会云原生专场上,腾讯云联合中国信通院.作业帮等率先在国内重磅发布了<降本之源-云原生成本管理白皮书>(简称白皮书),基于腾讯云在业内最大规模的 Ku ...