未加星标

MySQL恢复误操作的方法

字体大小 | |
[数据库(mysql) 所属分类 数据库(mysql) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏

一 前言

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

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

二常用的恢复方式

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 requirments . txt

用法

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 ] [ - - help ] [ - d [ DATABASES [ DATABASES . . . ] ] ] [ - t [ TABLES [ TABLES . . . ] ] ] [ - K ] [ - B ]

例子

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支持按照时间范围恢复。

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'
MySQL恢复误操作的方法

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


MySQL恢复误操作的方法

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

mysql > select * from flashback ; + - - - - + - - - - - - + | id | stat | + - - - - + - - - - - - + | 1 | 2 | | 2 | 3 | | 3 | 4 | | 4

本文数据库(mysql)相关术语:navicat for mysql mysql workbench mysql数据库 mysql 存储过程 mysql安装图解 mysql教程 mysql 管理工具

分页:12
转载请注明
本文标题:MySQL恢复误操作的方法
本站链接:http://www.codesec.net/view/522734.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(mysql) | 评论(0) | 阅读(76)