Mysql闪回工具之binlog2sql的原理及其使用

 

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

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

禅道11.0windows本机安装

为了验证禅道的某个功能,需要用到生产上的数据,又不能在生产上进行。只能在本地搭建一套禅道,还原生产的数据到本地。 1.下载禅道 生产上用的是禅道11.0,数据库是11.0版本的数据库,为了更好兼容,下载禅道…

createtrackbar函数_【3】OpenCV图像处理模块(10)inRange函数实现阈值化,HSV图像分割...

本节使用inRange函数来实现阈值化。跟前面的阈值化方法一样,只不过在实现时用阈值范围来替代固定阈值。本节还提供了一种物体检测的手段,用基于像素值范围的方法,在HSV色彩空间检测物体。HSV色彩空间HSV(hue,saturatio…

PPT取消自动播放

选中PPT页面,点击“切换”,检查下“设置自动换片时间”,如果勾选了,则去掉。

自动驾驶芯片_盘点全球自动驾驶芯片“战场”参与者

据了解,目前出货量最大的驾驶辅助芯片厂商Mobileye、Nvidia形成“双雄争霸”局面,Xilinx则在FPGA的路线上进军,Google、地平线、寒武纪向专用领域AI芯片发力,国内四维图新、全志科技、森国科(国科微)在自动驾驶芯片领域积极布局。…

word文档页码不连续怎么弄

页码不连续是因为在不连续页码的两页之间有分隔符。 第一步:搜索分节符 第二步:看页码与页面是否一致 wps的左下角 如果不一致,则第三步 第三步:设置页码:“继续上一页编码”

java多张图片合成一张_1分钟学会“全景照片”拍摄技巧,从单反拍摄到PS合成,收藏备用...

作为一名摄影爱好者,您知道如何才能快速拍出一张全景照片,同时保证高画质和照片不畸变?比如下面的2张图片:要想得到这样的全景照片,千万不要通过后期裁剪,否则清晰度肯定会大打折扣!其实&#x…

Chrome查看cookie

不同版本的Chrome查看cookie的入口位置不同,这里介绍个通用的方法。 1.进入设置页 2.搜索cookie 3.进入“cookie....”,选择“查看所有......”

nginx 带宽_Nginx的Gzip功能

程序员自由之路 | 作者urlify.cn/eyuUVr | 来源什么是HTTP压缩有时候客户端和服务器之间会传输比较大的报文数据,这时候就占用较大的网络带宽和时长。为了节省带宽,加速报文的响应速速,可以将传输的报文数据先进行压缩,然后再进行…

分享朋友圈QQ空间需要哪些参数

shareTitle(分享标题 , shareDes(分享描述 , shareImg(分享图片地址, shareUrl(分享地址, shareType(分享类型,微信朋友:WEIXIN、微信朋友圈:WEIXIN_CIRCLE、QQ:QQ)

这一年多来,阿里Blink测试体系如何从0走向成熟?

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 引言 Apache Flink是面向数据流处理和批处理的分布式开源计算框架,2016年阿里巴巴引入Flink框架,改造为Blink。2017年,阿里整合了所有流计算产品,决定以B…

system函数_自学C++基础教程【函数】

函数的概念一个函数由:函数的返回值类型、函数名、参数表、函数体 这4个部分组成。int Add( int _a , int _b ) {return _a _b; }该函数 Add 完成对两个整型数据的求和功能。函数的调用方式: 函数名(参数表);…

宁波政务云资源的介绍与申请

介绍 如图所示: 宁波政务云分公共服务区与资源共享区。 公共服务区 公共服务区,一般部署允许互联网访问的系统,数据不敏感,不重要的,可对外开发的系统。 该区允许互联网访问,不允许访问资源共享区&…

python帮助文档在哪_python文档在哪里

对于Python中一些不清楚的模块,可以通过文档学习如何使用,但是python文档在哪里呢?这个问题我们可以使用Python命令进行查看。方法一 在python命令行输入以下内容help(time) # 很详细的模块文档 help(time.localtime()) # 很详细的函数文档 h…

政务云公共服务区与资源共享区数据交换的方式

上文《宁波政务云资源的介绍与申请》介绍过,公共服务区与资源共享区是不能互访的,只能是资源共享区单向访问公共服务区。 我有一项目,要能互联网访问,又要访问“宁波大数据共享平台”的接口,“宁波大数据共享平台”在…

Java程序员的IntelliJ IDEA使用教程

前言 博主是Java程序员,以前一直都用myeclipse来开发的,说实话感觉myeclipse毫无美感可言,后来经过同事介绍,认识了IDEA,一眼就相中了IDEA黑色的主题风格,自此就抛弃了旧爱myeclipse。当时还不懂IDEA功能上…

python中random函数用法_random函数的用法

展开全部 用法: 1、随2113机生成(0,1)之间的浮点数 random.random() 2、随机生成100-200的整数5261 random.randint(100,200) 3、随机产生范围为410210间隔为2的数 random.randrange(0,11,2) 注:这里输出(0,2,4,6,8,10…

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits/stdc.h> using namespace std; int main(){int k;scanf("%d",&k);char s1[1010],s2[1010];scanf("%s%s",s1,s2);int same0;int ns…

Prince2与PMP的区别

p2有7个原则&#xff0c;7个主题&#xff0c;7个流程&#xff0c;即37二十一。 P2有26个管理产品模板。 2009版本是经典版本&#xff0c;2017版本与2009版本内容基本没变&#xff0c;梳理了目录&#xff0c;使内容更加有可读性。 P2是非常好的项目管理方法论&#xff0c;任何…

拉取远程分支_git clone切换分支步骤,代理设置,作者信息设置

1.克隆远程仓库git clone git地址2.查看所有分支git branch –a3.切换分支git checkout branchName4.查看当前所在分支git branch5.拉取代码git pull6.提交代码git add file/folder git commit -m comment git push可能遇到的问题&#xff1a;A.error: fatal: unable to acce…

[学习笔记]半平面交

一个直线把平面分成两部分&#xff0c;就是两个半平面 处理这两个平面的交的信息&#xff0c;就是半平面交 推荐&#xff1a; 计算几何之半平面交算法模板及应用 bzoj 2618 半平面交模板学习笔记 【总结】半平面交 可以用于求任意多边形交&#xff0c;任意多边形内核。 &#x…