MySQL恢复误删数据解决方案

摘要:
关于备份数据和binlog,请参阅以下文章:MySQL导入、导出、定时数据库备份MySQL 5.7启用binlog和简单数据恢复示例1。数据恢复的一般思想是从备份文件中恢复已备份的数据,以及一些尚未从binlog中备份的数据。场景2:未备份删除的数据。在binlog中查找记录的所有操作,并结合mysqlbinlog一步一步分析执行,最终恢复数据。

  工作中难免会误删数据,下面说一下怎样从导出的备份数据和binlog日志中恢复数据。关于备份数据和binlog可以参考下面的文章:

  MySQL导入、导出、数据库定时备份

  MySQL5.7开启binlog日志,及数据恢复简单示例

  一、恢复数据思路

  总体思路是从备份文件中恢复已备份的数据,还有一些未备份的数据从binlog日志中恢复。当然,具体场景具体分析,否则没有意义。如下:

  场景1:知道误删了一张表中ID是5的数据,有该数据的备份,且备份后该数据没有变过。此情况可以直接把备份的数据取出来,写入到该表中。

  场景2:删除的数据没有备份,在binlog日志中找到该记录的所有操作,结合mysqlbinlog一步步分析执行,最终恢复该条数据。

  从上面的两种场景来看,恢复数据都要找到该条数据的初始数据(即备份的数据,或者binlog日志中写入的数据),以及该条数据再后面是否经过变化。那么怎样知道该条数据后面是否经过变化?除了对业务的熟练,我就知道这个点儿数据不会被修改,更准确的方法还是查binlog日志。

  在实际中我们遇到的情况往往要比上面的场景复杂的多,比如我一不小心删除了一部分数据,这部分数据有的备份了,有的没有备份,并且数据量很大或者误删了表。这种情况比较复杂,下面演示一下这种情况下的数据恢复。

  二、演示恢复数据

  1、模拟数据操作

  1)准备数据

CREATE DATABASE IF NOT EXISTS mydb1 DEFAULT CHARACTER SET utf8;

USE mydb1;

DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id int(11) DEFAULT NULL,
  name varchar(20) DEFAULT NULL,
  age int(11) DEFAULT NULL,
  sex varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO student VALUES ('1', 'a1', '18', '男');
INSERT INTO student VALUES ('2', 'a2', '16', '女');
INSERT INTO student VALUES ('3', 'a3', '17', '男');
INSERT INTO student VALUES ('4', 'a4', '17', '女');
INSERT INTO student VALUES ('5', 'a5', '18', '男');
INSERT INTO student VALUES ('6', 'a6', '19', '女');

  2)数据备份

mysqldump -uroot -p123456 mydb1 > /var/mysql/backup/mydb1_$(date +%Y%m%d_%H%M%S).sql

  3)执行正常操作

INSERT INTO student VALUES ('7', 'a7', '17', '女');
INSERT INTO student VALUES ('8', 'a8', '17', '男');
INSERT INTO student VALUES ('9', 'a9', '20', '女');
UPDATE student SET name='a33' WHERE id=3;

  备份和当前的情况分别是:

  MySQL恢复误删数据解决方案第1张

  4)执行误删除操作

DELETE FROM student WHERE age=17;

  此时数据如下:

  MySQL恢复误删数据解决方案第2张

  5)执行正常操作

INSERT INTO student VALUES ('10', 'a10', '18', '女');
INSERT INTO student VALUES ('11', 'a11', '17', '男');

  最终数据如下 :

  MySQL恢复误删数据解决方案第3张

  2、恢复数据分析

  1)查找备份数据时的log日志文件,确定备份后,下一个次提交的偏移位置。

  我的方法是先查找当前的日志文件,然后依次往前面的号的文件里找,直到发现与备份日期相近的日期为止。

  MySQL恢复误删数据解决方案第4张

  当前的日志文件是2号文件,则先在2号文件中找日期与20200609_221029邻近的记录(备份日期是2020-06-09 22:10:29)

[root@localhost mysql]# mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002;

  MySQL恢复误删数据解决方案第5张

  可以看到,备份后,下一个次提交的偏移位置是8805。

  2)查找误删语句提交开始的偏移位置 

  MySQL恢复误删数据解决方案第6张

  可以看到误删语句提交开始的偏移位置是9935

  3)查找误删语句执行完之后的位置

  MySQL恢复误删数据解决方案第7张

  可以看到误删语句执行完之后的位置是10262

  4)执行导入备份sql语句,记住大致时间

mysql> source /var/mysql/backup/mydb1_20200609_221029.sql;

  5)找到日志中开始导入备份sql的位置

  MySQL恢复误删数据解决方案第8张

  可以看到开始导入备份sql的位置是10755 

  3、恢复数据

  1)导入备份sql已经恢复了部分数据

  2)恢复备份后到误删之前的数据,起始位置:8805到9935

mysqlbinlog --start-position=8805 --stop-position=9935 mysql-bin.000002 |mysql -uroot -p123456;

  3)恢复执行完误删语句之后到执行备份sql之前的数据,起始位置10262到10755

mysqlbinlog --start-position=10262 --stop-position=10755 mysql-bin.000002 |mysql -uroot -p123456;

  4)恢复完成,查看现在数据

  MySQL恢复误删数据解决方案第9张

  5)验证是否成功

  MySQL恢复误删数据解决方案第10张

  备注:

  1)本篇使用的MySQL版本是5.7.30,注意不同版本之间可能会有差异。

  2)完成数据恢复以后最好再执行一下备份语句,避免以后从日志恢复的时候,日志中包含导入备份sql语句,语句比较庞大。

  3)如果在导入备份sql的时候,在drop表之前,用户操作了表,而执行drop表后,用户操作信息被删除,可能导致数据丢失。

免责声明:文章转载自《MySQL恢复误删数据解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[信安Presentation]一种基于GPU并行计算的MD5密码解密方法统计一个版本代码变化行数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

拓端数据tecdat|R语言贝叶斯线性回归和多元线性回归构建工资预测模型

原文链接:http://tecdat.cn/?p=21641  工资模型 在劳动经济学领域,收入和工资的研究为从性别歧视到高等教育等问题提供了见解。在本文中,我们将分析横断面工资数据,以期在实践中使用贝叶斯方法,如BIC和贝叶斯模型来构建工资的预测模型。 加载包 在本实验中,我们将使用dplyr包探索数据,并使用ggplot2包进行数据可视化。我们也可...

MySQL 中随机抽样:order by rand limit 的替代方案

  最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。       但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使...

MySQL快速回顾:计算字段与函数

9.1 计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式。比如: 如果想要在一个字段中既显示公司名,又显示公式的地址,但这两个信息一般包含在不同的表列中。 城市、州和邮政编码存储在不同的列中,但邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来。 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。 在上面举的例子中,存储...

美团开源 SQL 优化工具 SQLAdvisor

https://www.oschina.net/news/82725/sqladvisor-opensource https://github.com/Meituan-Dianping/SQLAdvisor SQLAdvisor 是由美团点评公司北京 DBA 团队开发维护的 SQL 优化工具:输入SQL,输出索引优化建议,现已开源。 它基于 MySQL 原...

python pandas 对带时间序列的数据进行重采样处理

今天老板要处理一批带有时间序列的数据,源数据为1秒钟一行的csv数据,处理之后变成15分钟一行的数据。 源数据示例如下: time B00 B01 ... RollMean2.5RollMean10 2018-05-31 09:44:39 15.212 5.071 .....

Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to connect

Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to connect 远程连接mysql数据库,出现异常: null,message from server:"Host '27,45,38,132' is not allowe...