MySQL 两种恢复数据的方法

作者:用户1278550 时间:2024-01-18 03:48:35 

一 前言

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

来源:https://cloud.tencent.com/developer/article/1181418

标签:MySQL,恢复,数据
0
投稿

猜你喜欢

  • keras实现VGG16 CIFAR10数据集方式

    2023-08-19 08:27:08
  • Python面向对象编程之类的继承

    2021-10-27 23:46:39
  • python unichr函数知识点总结

    2022-02-03 11:48:31
  • Python端口扫描简单程序

    2022-12-26 02:19:45
  • 关于ORACLE通过file_id与block_id定位数据库对象遇到的问题引发的思考

    2024-01-18 11:01:08
  • 常用原生js自定义函数总结

    2024-04-16 09:05:57
  • 利用python实现JSON文档与Python对象互相转换

    2023-01-02 01:30:46
  • 如何go语言比较两个对象是否深度相同

    2024-02-18 21:21:58
  • Vue组件的继承用法示例详解

    2024-05-29 22:44:22
  • 网页设计软件FrontPage快捷键一览

    2008-02-24 16:55:00
  • 基于Tensorflow的MNIST手写数字识别分类

    2023-12-01 11:35:18
  • 详解Python如何获取视频文件的大小和时长

    2021-12-08 14:50:13
  • Python分割单词和转换命名法的实现

    2023-11-24 00:06:16
  • Django把SQLite数据库转换为Mysql数据库的过程

    2024-01-26 09:42:35
  • python tkinter中的锚点(anchor)问题及处理

    2021-05-06 23:53:16
  • SqlServer 2005 T-SQL Query 学习笔记(2)

    2024-01-20 20:21:51
  • python编写Logistic逻辑回归

    2022-03-04 16:57:03
  • Python之re模块详解

    2021-12-18 07:06:24
  • Python程序设计入门(2)变量类型简介

    2021-09-28 14:51:18
  • python模拟点击在ios中实现的实例讲解

    2021-11-28 13:03:34
  • asp之家 网络编程 m.aspxhome.com