【MySQL】恢复误操作的方法

一 、前言

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

写本文的时候 Monogdb 也被曝出有被利用安全漏洞,数据被删除了,希望各位DBA/安全相关人员及时查看自己负责的业务数据库安全相关问题,保护好自己的数据。

二、常用的恢复方式

2.1 利用备份恢复

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

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

2.2 利用开源工具binlog2sql 恢复

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

安装

用法

例子

误操作

update flashback set stat=15

恢复数据的步骤

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

本例子中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 执行到数据库,假如生产环境中真的发生了问题,一定要和开发沟通并且确认需要恢复的确切记录。

  1. mysql> select * from flashback;


mysql server必须开启,离线模式下不能解析

优点(对比mysqlbinlog)

纯Python开发,安装与使用都很简单
自带flashback、no-primary-key解析模式,无需再装补丁
flashback模式下,更适合闪回实战
解析为标准SQL,方便理解、调试
代码容易改造,可以支持更多个性化解析

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

三、总结

本文简单介绍了两种恢复误操作数据的方法,其实还有其他的方式 比如 使用 mysqlbinlog 编写脚本来恢复数据 ,利用闪回的patch 或者去哪儿的inception 等等 ,大家可以继续去研究。保护数据安全乃DBA的基本职责,每年都有各种

因为数据被误删除导致的惨案。希望每个DBA 都能守护好自己的生命线。

本文来自合作伙伴“DBGEEK”

时间: 2024-10-21 14:51:37

【MySQL】恢复误操作的方法的相关文章

MySQL数据库误操作后快速回滚的方法_Mysql

基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. binlog2sql快速回滚 首先,确认你的MySQL server开启了binlog,设置了以下参数: [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_siz

360安全浏览器恢复误关网页方法

  在使用浏览器时,我们经常不小心就关掉了它,有时候网页打开太多或者不记得自己看到哪里了就会很不方便.今天小编就来跟大家分享360安全浏览器恢复误关网页方法,希望能对大家有所帮助. 360安全浏览器恢复误关网页方法 快速恢复误关闭的网页:单击标签栏右侧的网页回收站按钮,即可快速恢复最近关闭的网页.单击按钮旁边的下拉箭头即可打开网页撤销列表,从撤销列表中可以找到之前访问的网页.

对MySQL中误操作的思考

作为一名DBA需要有着严谨的工作态度. 两台测试DB  Server A, Server B, 默认存储引擎InnoDB.有这样一个需求:需要将A中所有的表结构同步到B中.当时是这样做的: mysqldump -no-data...... 导出mysql表的文件后结果又将这些文件应用到了Server A 中,可想而知A中的 data已经被清空啦.由于是测试DB,数据量不大,用备份+binlog完全可以恢复的过来.但处于谨慎,得出第一个总结:对于新增加的表或者修改表结构的情况,要应用到其他DB的话

MySQL数据库防止人为误操作的实例讲解_Mysql

有不少开发人员在操作MySQL数据库的时候都遇到过误操作的情况,例如更新数据库的时候update语句忘记加上where条件,就会造成极为悲剧的结果.本文就针对防止MySQL数据库误操作的方法做出如下详解: 1.mysql帮助说明 # mysql --help|grep dummy -U, --i-am-a-dummy Synonym for option --safe-updates, -U. i-am-a-dummy FALSE 在mysql命令加上选项-U后,当发出没有WHERE或LIMIT

MySQL误操作后快速恢复数据的方法_Mysql

摘要: 利用binlog闪回误操作数据. 基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. 传统解法 用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态.然后跳过误操作的SQL,再继续应用binlog.此法费时费力,不值得再推荐. 利用binlog2sql快速闪回 首先,确认你的MySQ

9i新特性之Flashback Query的应用-------------针对DML误操作的恢复(2)

恢复 用DBMS_FLASHBACK包   DBMS_FLASHBACK 包提供了以下几个函数:   ENABLE_AT_TIME:设置当前SESSION 的闪回查询时间 ENABLE_AT_SYSTEM_CHANGE_NUMBER:设置当前SESSION的闪回查询SCN GET_SYSTEM_CHANGE_NUMBER:取得当前数据库的SCN       DISABLE:关闭当前SESSION 的闪回查询       如: SQL> select dbms_flashback.get_syst

ApexSQL Log-SQL误操作恢复工具(支持sql2008,sql2012)

今天不小心对数据库执行了一次误操作,心想有没有什么工具能恢复这次误操作呢?于是找到 了Log Explorer 4.2,可惜它最多只支持SQL 2005,在SQL 2008上无法使用,然后又找到了ApexSQL Log,最新版本最高支持SQL 2008以及SQL 2012,试用版可以提供功能无限制14天的免费试用期,功能倒真是强大   直接下载安装,官方下载地址:http://www.apexsql.com/sql_tools_log.aspx 安装完成,打开主界面:   点击"New"

ApexSQL Log-SQL误操作恢复工具

原文:ApexSQL Log-SQL误操作恢复工具 今天不小心对数据库执行了一次误操作,心想有没有什么工具能恢复这次误操作呢?于是找到了Log Explorer 4.2,可惜它最多只支持SQL 2005,在SQL 2008上无法使用,然后又找到了ApexSQL Log,最新版本最高支持SQL 2008以及SQL 2012,试用版可以提供功能无限制14天的免费试用期,功能倒真是强大   直接下载安装,官方下载地址:http://www.apexsql.com/sql_tools_log.aspx

SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

原文:SQLServer 2008以上误操作数据库恢复方法--日志尾部备份 原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题:          经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了.人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题.         遇到这种情况,一般都是没有做备份,不然也不会来发问了.首先要冷静,否则会