Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >恢复误操作的方法

恢复误操作的方法

作者头像
用户1278550
发布于 2018-08-09 06:13:31
发布于 2018-08-09 06:13:31
8990
举报
文章被收录于专栏:idbaidba

一 前言

前一段时间接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响。大多数情况是开发误操作delete数据,update多数行,根据之前的操作经验,本文介绍常用的恢复方法。

二 常用的恢复方式

2.1 利用备份恢复

使用这种方式的前提必须有最近的备份集或者知道出现误操作起始的binlog 位点或者GTID,利用备份集恢复到中间的机器上,然后利用MySQL的slave 特性

START SLAVE [SQL_THREAD] UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos;

until_option:

UNTIL { {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set | MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos | RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos | SQL_AFTER_MTS_GAPS }

恢复出到一个临时的实例,将误删除,更新的数据 dump 出来并恢复到老的实例里面。恢复数据期间的受影响的表最好不可写,否则将难以达到最想要的结果。例如 a=2 ,被误更新为 a=4,恢复的期间有被更新为a=7 ,结果恢复后又恢复为a=2 。 此种恢复方式 不适合恢复大量数据库,且需要临时实例。

2.2 利用开源工具binlog2sql 恢复

binlog2sql 是大众点评公司的DBA 开发的一款基于通过解析binlog将delete 恢复为insert,update 的值 set 字段和where条件做对调的原理来恢复数据的。 使用限制 MySQL的binlog format 必须是row 安装

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql pip install -r requirements.txt

用法

代码语言:javascript
AI代码解释
复制
usage: binlog2sql.py [-h HOST] [-u USER] 
                     [-p PASSWORD] [-P PORT]
                     [--start-file STARTFILE] 
                     [--start-position STARTPOS]
                     [--stop-file ENDFILE] 
                     [--stop-position ENDPOS]
                     [--start-datetime STARTTIME] 
                     [--stop-datetime STOPTIME]
                     [--stop-never] 
                     [-d [DATABASES [DATABASES ...]]]
                     [-t [TABLES [TABLES ...]]] 
                     [-K] [-B]
                     [--help] 

例子

代码语言:javascript
AI代码解释
复制
create table flashback(
id int(11) not null auto_increment primary key ,
stat int(11) not null default 1 
) engine=innodb default charset=utf8;

insert into flashback(stat) 
values (2),(3),(4),(7),(9),(22),(42),(33),(66),(88)

误操作

update flashback set stat=15

恢复数据的步骤

1 获取误操作的dml所在的binlog,不过一般开发可不知道具体binlog,他们只知道什么时间误操作了,binlog2sql支持按照时间范围恢复。

代码语言:javascript
AI代码解释
复制
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000009 | 177 |
| mysql-bin.000010 | 464 |
| mysql-bin.000011 | 8209 |
+------------------+-----------+
3 rows in set (0.00 sec)

本例子中binlog为mysql-bin.000011

2 利用binlog2sql 恢复数据,先解析binlog获取 update 语句的起始位点,本例中 start 5087 end 5428,执行命令

python binlog2sql.py -h127.0.0.1 -P3307 -udba -p'dbadmin' -dyang -tflashback --start-file='mysql-bin.000011'

使用binlog2sql -B 参数得到恢复的sql

将获取到的sql 执行到数据库,假如生产环境中真的发生了问题,一定要和开发沟通并且确认需要恢复的确切记录。

代码语言:javascript
AI代码解释
复制
mysql> select * from flashback;
+----+------+
| id | stat |
+----+------+
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 7 |
| 5 | 9 |
| 6 | 22 |
| 7 | 42 |
| 8 | 33 |
| 9 | 66 |
| 10 | 88 |
+----+------+
10 rows in set (0.00 sec)

binlog2sql的特点:

mysql server必须开启,离线模式下不能解析 优点(对比mysqlbinlog) 。

纯Python开发,安装与使用都很简单。

自带flashback、no-primary-key解析模式,无需再装补丁。

flashback模式下,更适合闪回实战。

解析为标准SQL,方便理解、调试。

代码容易改造,可以支持更多个性化解析.

其实MySQL 还提供了一个参数 sql_safe_updates,该参数将禁止 不带where 条件的delete和update语句。具体用法和介绍还请参考MySQL官方介绍。

三 总结

本文简单介绍了两种恢复误操作数据的方法,其实还有其他的方式 比如 使用 mysqlbinlog 编写脚本来恢复数据 ,利用闪回的patch 或者去哪儿的inception 等等 ,大家可以继续去研究。保护数据安全乃DBA的基本职责,每年都有各种 因为数据被误删除导致的惨案。希望每个DBA 都能守护好自己的生命线。推荐几篇关于数据恢复相关的文章:

[1] mysqlbinlog flashback 5.6完全使用手册与原理

[2] 拿走不谢,Flashback for MySQL 5.7

[3] MySQL闪回方案讨论及实现

[4] danfengcao, binlog2sql: Parse MySQL binlog to SQL you want ---本文介绍的工具

[5] MySQL下实现闪回的设计思路 (MySQL Flashback Feature)

有兴趣的朋友可以通过阅读原文来看推荐文章链接。

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

本文分享自 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用binlog2sql针对mysql进行数据恢复
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚。传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据。此法费时费力,甚至需要停机维护,并不适合快速回滚。也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能。
大道七哥
2019/09/10
1K0
[715]python binlog2sql同步mysql数据
binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。
周小董
2020/01/13
2.2K0
[715]python binlog2sql同步mysql数据
Mysql误删,恢复数据,binlog闪回,宝塔面板
MySQL闪回(flashback)利用binlog直接进行回滚,能快速恢复且不用停机。
宣言言言
2019/12/17
3.5K0
【MySQL】删库别着急跑路(三)--binlog2sql闪回工具的使用
再说binlog2sql闪回工具之前,我们先聊下binlog。Binlog记录了MySQL数据库所有的DDL和DML操作。它在MySQL数据库里起着至关重要的作用。
MySQL数据库技术栈
2020/08/05
7710
【MySQL】删库别着急跑路(三)--binlog2sql闪回工具的使用
DML 误操作?MySQL 闪回工具大盘点
作者:雷文霆,爱可生华东交付服务部 DBA 成员,主要负责 MySQL 故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 ----
爱可生开源社区
2025/04/09
3150
DML 误操作?MySQL 闪回工具大盘点
MYSQL数据闪回方式
MYSQL官方截止目前还没有出来数据闪回特性,也许后续版本会出现。社区有一些开源工具可以使用,沿用的基本都是彭立勋最早提出的思路,利用binlog对SQL进行反向解析,从而实现数据闪回,例如不带where条件的update操作,导致全表数据被误更新。 闪回前提: binlog_format = ROW 操作模拟: 没加where条件,导致全表更新;或者没加host列,导致多余行被更新。 我只想把user=test_user1,host=1.1.1.1改密码,但是没加host条件。此时并没有及时发现,直到报错
MySQL轻松学
2018/03/09
3.2K1
MYSQL数据闪回方式
使用binlog2sql恢复数据
在MySQL里面,如果我们有延迟从库的话,也可以找回之前的数据,但是有时候不太好使(因为追数据到误操作前的准确的时间点有时候也不太好把握)。
保持热爱奔赴山海
2019/12/24
6770
删库不跑路!我含泪写下了 MySQL 数据恢复大法…
点击关注公众号,Java干货及时送达 作者:程淇铭 来源:segmentfault.com/a/1190000020116271 日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。 相关文章 MySQL备份策略:https://segmentfault.com/a/1190000019955399 MySQL数据恢复:https://segmentfault.com/a/1190000020116271 1 前言 数据恢
Java技术栈
2022/03/18
7690
删库不跑路:论MySQL数据恢复
日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。
JavaFish
2020/07/21
1.7K0
binlog2sql,你该知道的数据恢复工具
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要用途如下:
俊才
2020/09/24
2.2K0
MySQL误操作数据恢复的简单实践(r11笔记第67天)
前几天有个同事碰到了一个MySQL数据恢复的问题,他运行了一条update语句,结果忘记了加where条件,结果等反应过来已经晚了。我简单确认了下,是否存在备份,没有,是否开启了日志,没有。所以这个恢复无从谈起。 当然后来他也花了些功夫逐条数据修复,事情过去了,数据恢复的重要性,人为操作的重要性就不言而喻了,但是有些时间工作职责还是需要下移。我觉得还是需要好好总结下数据恢复的问题。我会从以下几个方面来谈。 目录 ⊙ 手工恢复数据的简单示例 ⊙使用开源工具恢复数据的配置 ⊙ 使用开源工具
jeanron100
2018/03/21
8350
当删库时如何避免跑路
删库跑路也是个老梗了,可见在运维数据库的过程中误删除数据,或者开发的代码有bug,造成数据的误删除屡见不鲜。不过现在也有许多用于恢复或预防误删除的方案,例如SQL管理系统,将要执行的SQL先交由管理员审核,然后由管理员备份一个镜像数据库,在镜像上执行该SQL,并在执行后还原镜像。这样经过层层把关就可以大大减小出现误操作的几率。
端碗吹水
2020/09/23
1.2K0
当删库时如何避免跑路
开源数据闪回工具—binlog2sql介绍
binlog2sql是国内MySQL大佬danfengcao使用python开发,许多MySQL爱好者参与改进的一款MySQL binlog解析软件。根据不同选项,可以得到原始SQL、回滚SQL、去除主键的SQL等。
MySQL轻松学
2020/07/24
3K1
MySQL数据快速恢复的一些思考
这是很早时候写的一篇文章,今天翻看历史文章的时候发现的,觉得还是有收获,就分享出来了。以下是文章原文:
AsiaYe
2022/05/17
7110
MySQL数据快速恢复的一些思考
Mysql备份与恢复
用于保证InnoDB备份数据时的一致性,配合RR隔离级别一起使用;当发起事务时,读取一个数据的快照,直到备份结束,都不会读取到本事务开始之后提交的任何数据
mikelLam
2022/10/31
3.8K0
一次MySQL线上数据恢复过程
这个周末过得相当充实,当我们做一些有意思的事情的时候,就会觉得周末的时间特别长。周天晚上还发烧了,幸亏楼下的药店还开着门,下去买了点儿药,吃完睡了一觉,才感觉缓了过来,满血复活,继续上班。。。
AsiaYe
2019/11/06
8560
使用binlog2sql做数据恢复的简单示例
有时我们会遇到操作人员误删或者误更新数据的情况,这时我们迫切希望把原来的数据还原回来,今天我们介绍一个简单的工具来方便的实现此功能。
java思维导图
2019/09/10
6960
使用binlog2sql做数据恢复的简单示例
【MySQL】Mysql误操作后使用binlog2sql快速回滚
DML(data manipulation language): 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
用户5522200
2019/06/02
1.8K0
数据库误操作数据恢复
小明都想好跑路的国家了,小董出手相助,祭出今天要介绍的工具ra,github地址:https://github.com/DHBin/raopen in new window
DH镔
2023/10/21
3170
[MySQL]mysql binlog回滚数据
log-bin = /var/log/mysql/mysql_bin #binlog日志文件,以mysql_bin开头,六个数字结尾的文件:mysql_bin.000001,并且会将文件存储在相应的xxx/xxx路径下,如果只配置mysql_bin的话默认在C:\ProgramData\MySQL\MySQL Server 5.7\Data下; binlog_format = ROW #binlog日志格式,默认为STATEMENT:每一条SQL语句都会被记录;ROW:仅记录哪条数据被修改并且修改成什么样子,是binlog开启并且能恢复数据的关键; expire_logs_days= 10 #binlog过期清理时间; max_binlog_size = 100m #binlog每个日志文件大小; binlog_cache_size = 4m #binlog缓存大小; max_binlog_cache_size = 512m #最大binlog缓存大小。 service mysql restart #重启一下
唯一Chat
2020/02/18
6.5K0
[MySQL]mysql binlog回滚数据
相关推荐
使用binlog2sql针对mysql进行数据恢复
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档