前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用binlog2sql做数据恢复的简单示例

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

作者头像
java思维导图
发布2019-09-10 16:33:45
4890
发布2019-09-10 16:33:45
举报
文章被收录于专栏:java思维导图
  • 飘扬的红领巾
  • https://www.cnblogs.com/leefreeman/p/7680953.html

有时我们会遇到操作人员误删或者误更新数据的情况,这时我们迫切希望把原来的数据还原回来,今天我们介绍一个简单的工具来方便的实现此功能。

前提条件

在实现数据恢复之前,需要我们的 MySQL 满足以下配置条件:

代码语言:javascript
复制
[mysqld]
server_id = 1
log_bin = bin
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

以上配置都是 MySQL 的常规配置,不存在特殊配置的情况,所以你其实不用太担心。

构造实验数据

接下来我们建一个简单的 user 表,并插入示例数据。

代码语言:javascript
复制
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'liping', 'ADFASDFASDF', '2017-10-17 10:57:42');
INSERT INTO `user` VALUES ('2', 'xiaoming', 'SDDSFGSDFGSDG', '2017-10-17 10:58:06');
INSERT INTO `user` VALUES ('3', 'xiaohong', 'QEWFGFGDSFGSDG', '2017-10-17 10:58:29');

执行误操作

接下来如果操作人员执行了一个误操作,试图修改 liping 的密码为 123456, 但忘记了加 where 条件,即执行了 SQL:

代码语言:javascript
复制
update user set `password`='123456';

导致所有的用户密码都被设置为了 123456。

数据恢复

接下来我们将尝试恢复原来的数据,首先因为我们开启了二进制日志,所以其实我们的每次操作都被记录到了二进制日志当中,我们可以使用二进制查看命令,查询到我们刚才所做的操作痕迹。

首先定位到当前 MySQL 写到了哪个二进制文件中,进入到 MySQL 执行命令:

代码语言:javascript
复制
show master status;

可以看到当前的二进制文件写到了 bin.000002。于是我们用二进制文件查看命令,找出刚才操作的痕迹。(请注意二进制文件的路径,修改为你的二进制文件路径)

代码语言:javascript
复制
mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS /mdata/mysql_data/bin.000002 | grep -B 15 '123456'

从上图可以看出二进制文件记录了我们对每行数据修改的痕迹,其中 @1 @2 @3 @4 表示我们 user 表中的 4 个字段,看到这些记录你应该可以想到,如果我们把这些记录逆向执行,这数据就可以恢复。所以这里提供了一个思路,就是可以通过文本操作,把 update set 前后的字符串调换,保存成 SQL,即可实现数据还原,但真正实现起来还是挺麻烦的。这里我们介绍 binlog2sql 工具,你不用那么麻烦的去实现此功能。

binlog2sql 工具

binlog2sql 是大众点评开源的一款用于解析 binlog 的工具,详见:https://github.com/danfengcao/binlog2sql

使用 binlog2sql 将二进制文件转换为 SQL:

代码语言:javascript
复制
python binlog2sql.py -h10.89.1.143 -P3306 -udev -p'123456' -dtest -t user --start-file='bin.000002'

使用 binlog2sql 将二进制文件解析为了 SQL 格式,这个文件当中包括我们之前做的建表 SQL 以及插入示例数据的 SQL,当然也包括我们误操作的 UPDATE 语句。

这里我们重点看黄色框包含的内容,它是我们 update 语句记录在二进制文件当中的起止位置,我们可以看到三条 UPDATE 语句都记录到:#start 2616 end 3028,所以我们待会恢复时,只需要恢复这个位置的数据就可以了。

使用 binlog2sql 生成回滚 SQL

代码语言:javascript
复制
python binlog2sql.py --flashback -h10.89.1.143 -P3306 -udev -p'123456' -dtest -tuser --start-file='bin.000002' --start-position=2616 --stop-position=3028

可以看到 binlog2sql 生成了:#start 2616 end 3028 位置的回滚 SQL。我们把这个 SQL 复制下来到 MySQL 中执行,即可实现数据恢复。

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java思维导图 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档