【MySQL】恢复误操作的方法

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 一 前言   本周接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响。
一 前言
  本周接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响。大多数情况是开发误操作delete数据,update多数行,根据之前的操作经验,本文介绍常用的恢复方法。
  写本文的时候 Monogdb 也被曝出有被利用安全漏洞,数据被删除了,希望各位DBA/安全相关人员及时查看自己负责的业务数据库安全相关问题,保护好自己的数据。
二常用的恢复方式
2.1 利用备份恢复
  使用这种方式的前提必须有最近的备份集或者知道出现误操作起始的binlog 位点或者GTID,利用备份集恢复到中间的机器上,然后利用MySQL的slave 特性
  1. START SLAVE [SQL_THREAD] UNTIL
  2.     MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos;
  3. until_option:
  4.     UNTIL { {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set
  5.           | MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
  6.           | RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
  7.           | 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 
安装
  1. git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
  2. pip install -r requirments.txt
用法
  1. usage: binlog2sql.py [-h HOST] [-u USER] [-p PASSWORD] [-P PORT]
  2.                      [--start-file STARTFILE] [--start-position STARTPOS]
  3.                      [--stop-file ENDFILE] [--stop-position ENDPOS]
  4.                      [--start-datetime STARTTIME] [--stop-datetime STOPTIME]
  5.                      [--stop-never] [--help] [-d [DATABASES [DATABASES ...]]]
  6.                      [-t [TABLES [TABLES ...]]] [-K] [-B]
例子
  1. create table flashback(
  2. id int(11) not null auto_increment primary key ,
  3. stat int(11) not null default 1
  4. ) engine=innodb default charset=utf8;
  5. insert into flashback(stat) values (2),(3),(4),(7),(9),(22),(42),(33),(66),(88)
误操作
  1. update flashback set stat=15
恢复数据的步骤
1 获取误操作的dml所在的binlog,不过一般开发可不知道具体binlog,他们只知道什么时间误操作了,binlog2sql支持按照时间范围恢复。
  1. mysql> show master logs;
  2. +------------------+-----------+
  3. | Log_name | File_size |
  4. +------------------+-----------+
  5. | mysql-bin.000009 | 177 |
  6. | mysql-bin.000010 | 464 |
  7. | mysql-bin.000011 | 8209 |
  8. +------------------+-----------+
  9. 3 rows in set (0.00 sec)
本例子中binlog为mysql-bin.000011
2 利用binlog2sql 恢复数据,先解析binlog获取 update 语句的起始位点,本例中  start 5087 end 5428
  1. 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;
  2. +----+------+
  3. | id | stat |
  4. +----+------+
  5. | 1 | 2 |
  6. | 2 | 3 |
  7. | 3 | 4 |
  8. | 4 | 7 |
  9. | 5 | 9 |
  10. | 6 | 22 |
  11. | 7 | 42 |
  12. | 8 | 33 |
  13. | 9 | 66 |
  14. | 10 | 88 |
  15. +----+------+
  16. 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) 
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
关系型数据库 MySQL 数据库
MySQL的delete误操作的快速恢复方法
如果我们在数据库中不小心执行了类似“delete from t1”这样的不带where条件的语句,那么整张表的数据就全被删除了,如何在最短的时间恢复被删除的数据就显得十分关键。下面来演示如何通过binlog来快速恢复表数据。
14417 0
MySQL的delete误操作的快速恢复方法
|
2月前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
555 2
|
5月前
|
SQL 关系型数据库 MySQL
mysql误删数据后,你会怎么办?
mysql误删数据后,你会怎么办?
90 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL 恢复误删除数据
MySQL 恢复误删除数据
53 0
|
SQL 关系型数据库 MySQL
MySQL操作之数据备份与还原
MySQL操作之数据备份与还原
65 0
|
关系型数据库 MySQL 数据库
Mysql 数据备份与恢复(详细步骤)
Mysql 数据备份与恢复(详细步骤)
232 0
|
SQL 关系型数据库 MySQL
MySQL的备份和恢复案例
当发生掉电或硬件故障,MySQL重新启动时会自动进行Crash Recovery,从日志文件中读取pending的信息,rollback uncommit同时把已经提交的交易flush到datafile,这些信息可以从MySQL的错误日志中看到,这里我用kill -9模拟宕机
172 0
|
SQL Oracle 关系型数据库
MySQL误删恢复方法1
MySQL不同于oracle,没有闪回查询这类概念,但网上流传几个闪回的开源工具如 binglog2sql、MyFlash,可以使用binglog日志进行误操作数据的恢复。
166 0
|
SQL 运维 关系型数据库
MySQL误删恢复方法2
实际工作中总会发生数据误删除的场景,在没有备份情况下,如何快速恢复误删数据就显得非常重要。 本文基于MySQL的binlog日志机制,当日志格式设置为“binlog_format=ROW”时,记录一步一步手动解析binlog、恢复误删数据的全过程,供大家参考使用。
186 0
|
SQL 存储 关系型数据库
Mysql数据备份与恢复
- binlog 的作用 - mysqldump 和 mysqlbinlog 做数据备份和数据恢复。 - XtraBackup 全量备份和增量备份
1246 0
Mysql数据备份与恢复