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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python学习——尾递归及装饰器优化
尾递归与一般的递归不同在于对内存的占用:普通递归创建stack累积而后计算收缩,尾递归只会占用恒量的内存。
Sparkle^
2022/03/26
1.1K0
经典动态规划问题 -- 青蛙上台阶与 python 的递归优化
一大早,前同事在微信上给出了个题: 一只青蛙上台阶,一次只能上一个或两个台阶,如果总共有3个台阶,那么有三种上法:
用户3147702
2022/06/27
8350
经典动态规划问题 -- 青蛙上台阶与 python 的递归优化
Python中的尾递归
尾递归的原理:当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。
K同学啊
2019/01/22
1.6K0
Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录:     一、三元表达式、列表推导式、生成器表达式     二、递归调用和二分法     三、匿名函数     四、内置函数 ================================
Jetpropelledsnake21
2018/05/02
1.3K0
Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
Python 中的递归,你真的懂了吗?
出现的效果就是,这个函数在不断的调用自己,每次调用就n+1,相当于循环了。  可是为何执行了900多次就出错了呢?还说超过了最大递归深度限制,为什么要限制呢?
用户7886150
2021/01/21
8360
Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
TypeError: my_abs() takes exactly 1argument (2 given)#参数个数不对
Ai学习的老章
2019/04/10
4890
11月6日排序函数,匿名函数,回调函数,递归函数, zip函数
##### 排序sort, sorted的区别: list.sort(func=None, key=None, reverse=False(or True)) 对于reverse这个bool类型参数,当reverse=False时:为正向排序;当reverse=True时:为方向排序。默认为False。 执行完后会改变原来的list,如果你不需要原来的list,这种效率稍微高点 >>> list = [2,8,4,6,9,1,3] >>> list.sort() >>> list [1, 2, 3, 4, 6, 8, 9]
武军超
2019/02/25
1.1K0
Python递归函数
https://www.python-course.eu/recursive_functions.php
py3study
2020/01/20
1.5K0
Python中的栈溢出及解决办法
1.递归函数 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。 于是,fact(n)用递归的方式写出来就是: def fact(n):
用户1214487
2018/03/28
1.7K0
漫谈递归转非递归
一:递归的思想       之前面试腾讯,面试官问了一个问题:说说递归和循环的区别?当时没有答出问题的本质,只是简单地解释了这两个词的意思,囧,今天就借由这篇文章来谈谈自己对递归的理解。       我们一般对递归的印象就是一个函数反复的“自己调用自己”,代码精炼,便于阅读。但是,从本质上来说,递归并不是简单的自己调用自己,而是一种分析和解决问题的方法和思想。简单来说,递归思想就是:把问题分解成规模更小,但和原问题有着相同解法的问题。典型的问题有汉诺塔问题,斐波那契数列,二分查找问题,快速排序问题等。PS:
Linux云计算网络
2018/01/11
2.1K0
漫谈递归转非递归
一篇文章带你了解Python递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
Python进阶者
2021/04/19
6530
一篇文章带你了解Python递归函数
3 Python 基础: Python函数及递归函数知识点梳理
函数的英文是function,所以,通俗地来讲,函数就是功能的意思。函数是用来封装特定功能的,比如,在Python里面,len()是一个函数,len()这个函数实现的功能是返回一个字符串的长度,所以说len()这个函数他的特定功能就是返回长度,再比如,我们可以自己定义一个函数,然后编写这个函数的功能,之后要使用的时候再调用这个函数。所以函数分为两种类型,一种是系统自带的不用我们编写其功能系统自己就有的,比如len()这种函数,另一种函数是我们自定义的,需要我们编写其功能的,这种函数自由度高,叫做自定义函数,需要使用的时候直接调用该函数。
野原测试开发
2019/07/24
1.2K0
3 Python 基础: Python函数及递归函数知识点梳理
python基础——匿名函数及递归函数
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
菲宇
2019/06/13
5460
python基础——匿名函数及递归函数
Python之递归函数
Python之递归函数 好久没有更新内容了,也好久没有给大家打个招呼了,小白想死你们了。今天跟大家说说Python中的递归函数。 Python是支持递归函数的。简单地说,一个递归函数就是直接或间接地调用自身的函数,并且要有退出条件。枯燥的概念令人生厌,我们直接来个例子看看递归函数是如何工作的。 例如我们对一个数字列表进行求和计算,我们可以使用内置的sum函数或者自己写一个函数来完成计算工作,接下来我们看看如何使用递归来完成求和运算: In[1]: def mysum(L): ...: if no
1846122963
2018/03/09
1.2K0
Python栈溢出
python3.5.4 递归函数最恶心的时候莫非栈溢出(Stack overflow)。
py3study
2020/01/13
1.9K0
3 Python 基础: Python函数及递归函数知识点梳理
函数的英文是function,所以,通俗地来讲,函数就是功能的意思。函数是用来封装特定功能的,比如,在Python里面,len()是一个函数,len()这个函数实现的功能是返回一个字符串的长度,所以说len()这个函数他的特定功能就是返回长度,再比如,我们可以自己定义一个函数,然后编写这个函数的功能,之后要使用的时候再调用这个函数。所以函数分为两种类型,一种是系统自带的不用我们编写其功能系统自己就有的,比如len()这种函数,另一种函数是我们自定义的,需要我们编写其功能的,这种函数自由度高,叫做自定义函数,需要使用的时候直接调用该函数。
野原测试开发
2019/09/10
7940
3 Python 基础: Python函数及递归函数知识点梳理
朋友你听说过尾递归吗
本文介绍了尾递归和尾调用优化,尾递归是指在函数尾递归调用时不会创建新的调用帧,而是直接在原调用帧上进行递归。尾调用优化是指函数在调用时不会创建新的调用帧,而是直接在原调用帧上进行调用。这种优化可以节省内存空间和提高程序的运行速度。
IMWeb前端团队
2017/12/29
1.3K0
朋友你听说过尾递归吗
学习Javascript之尾调用
总括: 本文介绍了尾调用,尾递归的概念,结合实例解释了什么是尾调用优化,并阐述了尾调用优化如今的现状。
Damonare
2020/02/23
1.4K0
学习Javascript之尾调用
7-函数
当存在多个默认参数的时候,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。
用户3106371
2019/03/11
8540
7-函数
递归函数实现 HelloWorld 的详细推理及实际示例
实现 HelloWorld 通常是每一个程序员学习编程语言的第一步,但在这里,我们要挑战一种非常规的方法,那就是使用递归函数来完成。递归,顾名思义,就是一个函数不断地调用自身的过程,直到达成某种基准条件。那么如何用这种自调用的方式,实现一个看似简单的 HelloWorld 输出呢?这需要从递归的核心概念、递归的基准条件、实际的递归函数编写,以及其中可能涉及到的一些底层原理来一步步详细解释。
编程小妖女
2024/12/17
2760
递归函数实现 HelloWorld 的详细推理及实际示例
推荐阅读
相关推荐
Python学习——尾递归及装饰器优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档