MySQL 两种恢复数据的方法

 更新时间:2020年10月29日 10:42:08   作者:用户1278550  
这篇文章主要介绍了MySQL 两种恢复数据的方法,帮助恢复线上数据,保证数据完整,感兴趣的朋友可以了解下

一 前言

前一段时间接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对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

用法

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] 

例子

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'

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

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

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 都能守护好自己的生命线。

以上就是MySQL 两种恢复数据的方法的详细内容,更多关于MySQL 恢复数据的资料请关注脚本之家其它相关文章!

相关文章

  • mysql5.5与mysq 5.6中禁用innodb引擎的方法

    mysql5.5与mysq 5.6中禁用innodb引擎的方法

    这篇文章主要介绍了mysql5.5中禁用innodb引擎的方法,需要的朋友可以参考下
    2014-04-04
  • MHA实现mysql主从数据库手动切换的方法

    MHA实现mysql主从数据库手动切换的方法

    这篇文章主要介绍了MHA实现mysql主从数据库手动切换的方法,详细的讲述了主从数据库切换的步骤与方法,非常实用,需要的朋友可以参考下
    2014-10-10
  • MySQL临时表的具体使用

    MySQL临时表的具体使用

    MySQL中的临时表是在会话期间存在的表,本文主要介绍了MySQL临时表的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • MySQL子查询的使用详解下篇

    MySQL子查询的使用详解下篇

    子查询是在查询语句里面再嵌套一个查询,这是因为我们在提取数据的时候有很多不知道的数据产生了依赖关系。本文为大家总结了一下MySQL数据库子查询语法规则,感兴趣的可以了解一下
    2022-08-08
  • MySQL中join查询的深入探究

    MySQL中join查询的深入探究

    数据库中的JOIN称为连接,连接的主要作用是根据两个或多个表中的列之间的关系,获取存在于不同表中的数据,下面这篇文章主要给大家介绍了关于MySQL中join查询的深入探究,需要的朋友可以参考下
    2022-11-11
  • mysql存储过程之返回多个值的方法示例

    mysql存储过程之返回多个值的方法示例

    这篇文章主要介绍了mysql存储过程之返回多个值的方法,结合实例形式分析了mysql存储过程返回多个值的实现方法与PHP调用技巧,需要的朋友可以参考下
    2019-12-12
  • CentOS6.7 mysql5.6.33修改数据文件位置的方法

    CentOS6.7 mysql5.6.33修改数据文件位置的方法

    mysql存放的数据文件,分区容量较小,目前已经满,导致mysql连接不上,怎么解决呢?下面小编给大家分享CentOS6.7 mysql5.6.33修改数据文件位置的方法,一起看看吧
    2017-06-06
  • mysql累积聚合原理与用法实例分析

    mysql累积聚合原理与用法实例分析

    这篇文章主要介绍了mysql累积聚合原理与用法,结合实例形式分析了mysql累积聚合原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • 解决MySQL读写分离导致insert后select不到数据的问题

    解决MySQL读写分离导致insert后select不到数据的问题

    这篇文章主要介绍了解决MySQL读写分离导致insert后select不到数据的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • MySQL 用户权限与安全管理最佳实践

    MySQL 用户权限与安全管理最佳实践

    MySQL用户权限与安全管理是保障数据库系统稳定与安全的重要环节,通过合理设计权限模型、使用 GRANT/REVOKE命令管理权限、实施最小权限原则以及加强密码,可以大幅降低数据库被非法访问和数据泄露的风险,这篇文章主要介绍了MySQL 用户权限与安全管理,需要的朋友可以参考下
    2025-03-03

最新评论