mysql误删后使用binlog恢复数据

1 预期效果

使用 binlog 恢复数据的预期效果是将误删的数据还原到误删之前的状态,以减少或消除数据丢失的影响。通过正确解析和执行 binlog 中的操作记录,可以重新执行误删操作之后的插入、更新或删除操作,从而恢复被误删的数据。

  1. 数据恢复:通过恢复误删操作之后的操作记录,可以将误删的数据重新插入到数据库中,还原到误删之前的状态。这意味着恢复后的数据库将包含被误删的数据,以及误删之后的其他操作。

  2. 数据一致性:如果只选择了误删操作之后的操作记录进行恢复,而忽略了其他更改操作,可以确保恢复后的数据保持一致性。这意味着只有被误删的数据会恢复,而其他更改操作不会被重新执行。

  3. 最小化数据丢失:使用 binlog 恢复数据可以最小化数据丢失的影响。通过恢复误删操作之后的操作记录,可以尽可能地还原被误删的数据,而无需依赖数据库备份或其他手段。

需要注意的是,预期效果可能受到以下因素的影响:

  • 其他更改操作:如果误删操作之后进行了其他更改操作,恢复过程可能会导致这些操作被重新执行,可能会引起数据不一致或冲突。因此,在执行恢复操作之前,应仔细分析 binlog 文件,并选择适当的操作记录进行恢复。

  • 数据库状态和依赖项:误删操作可能依赖于特定的数据库状态或外部数据。在执行恢复操作之前,应确保数据库的环境和依赖项与误删操作发生时相同,以确保恢复的数据能够正确关联和使用。

  • 恢复操作的正确性:正确解析和执行 binlog 中的操作记录是关键。在执行恢复操作之前,应仔细验证和测试恢复过程,确保操作记录的准确性和正确性。

2实现原理

binlog记录了数据库中的所有更改操作,以便在需要时进行数据恢复、主从复制和数据审计等操作。通过解析和分析binlog,可以还原数据库中的数据更改历史,并进行相应的操作,例如数据恢复或主从复制等

下面是使用 binlog 恢复数据的一般原理:

  1. 确认误删的时间点:首先,需要确定误删操作发生的时间点。这将帮助你确定要恢复的数据范围,以便从 binlog 中提取相应的操作记录。

  2. 导出 binlog 文件:找到包含误删操作的 binlog 文件。这通常是通过查看 MySQL 数据库的配置文件(如 my.cnf 或 my.ini)中的 binlog 相关配置参数来确定。将该 binlog 文件复制到安全的位置,以便进行恢复操作。

  3. 解析 binlog 文件:使用 mysqlbinlog 工具来解析 binlog 文件,并将其转换为可读的 SQL 语句。例如,可以执行以下命令:mysqlbinlog binlog-file > output.sq              其中 binlog-file 是实际的 binlog 文件名,output.sql 是输出的 SQL 文件,包含了所有的操作记录。

  4. 过滤和恢复操作:在生成的 SQL 文件中,可以根据误删操作发生的时间点,选择需要恢复的操作记录。可以手动编辑 SQL 文件,删除不需要的操作记录,只保留误删操作之后的操作语句。确保只包含了需要恢复数据的操作。

  5. 执行恢复操作:使用数据库客户端连接到 MySQL 数据库,并执行编辑后的 SQL 文件,将其中的操作语句逐个重新执行。这将重新执行误删操作之后的操作,从而还原到误删前的数据状态。

需要注意的是,使用 binlog 恢复数据存在一些限制和风险,包括:

  • 误删操作之后的其他修改:如果误删操作之后的时间段内进行了其他更改操作,这些操作也将被重新执行,可能会导致数据不一致或冲突。在恢复数据之前,应仔细分析 binlog 文件,确保只恢复必要的操作。

  • 依赖外部数据和状态:如果误删操作涉及到外部数据或依赖于特定的数据库状态,恢复过程可能会受到影响。在执行恢复操作之前,确保数据库的环境和依赖项与误删操作发生时相同。

  • 数据库备份和恢复策略:为避免数据丢失和误删除的影响,建议实施定期的数据库备份和恢复策略,并测试和验证备份的可用性和完整性。

3实际操作

3.1 查看自己的binlog日志是否打开

在黑窗口中输入命令查看show variables like 'log_bin%' ;  ,一般都是默认打开的

  1. log_bin 变量被设置为 ON,表示二进制日志功能已经启用。

  2. log_bin_basename 显示二进制日志文件的路径和文件名前缀。

  3. log_bin_index 显示二进制日志索引文件的路径。

  4. 其他一些与二进制日志相关的配置项的值。

    sql_log_bin 是 MySQL 中一个非常有用的系统变量,它控制当前会话是否将执行的 SQL 语句记录到二进制日志中。

    可以通过SET sql_log_bin = 1;修改成ON

3.2 查看binlog文件

通过上一步查询的log_bin_basename得到的路径打开存储binlog文件的文件夹

可以看到已经有很多log文件了

(这里我们是要测试binlog恢复数据的使用,所以就日志文件都放到一个全新binlog文件中方便查询使用,如果是实际恢复数据的话,就要一个一个的在这些binlog文件中找自己要的那部分文件了。)

3.3 模拟数据库

在数据库中进行 flush logs 命令可以新创一个binlog文件,接下来的操作也就会放到新的文件中了。此时再进入到上面这个文件夹中就会看到又多了一个文件叫做LAPTOP-595LBSCH-bin.000092

假设我们的数据库是7天一备份,然后binlog的过期时间是大于7天的,那么通过备份的数据库+binlog文件就能够恢复数据库到达7天内的任意一个时间点的状态。,下面是一个模拟备份的行为

之后我们进行一些操作,模拟正常数据库操作

​
​
​
添加一条数据:
INSERT INTO `user` (`id`, `name`) VALUES (6, '老六');
将小二改成张三丰:
UPDATE `user` SET `name` = '张三丰' WHERE `id` = 1;
将王五改成王伟:
UPDATE `user` SET `name` = '王伟' WHERE `name` = '王五';
删除整个表:
DROP TABLE `user`;​​​

经过这些操作之后!

3.4 恢复操作实战

现在的处境就是整个表都被删除了,我们想要实现将数据库改成王五刚被改成王伟的数据库的模样

我们要做的就是将上次备份的数据库恢复,然后从上次备份的时间点 - > 到王五刚被改成王伟的时间点   中的binlog操作都找到

3.41、我们在binlog所在的文件夹位置打开黑窗口,然后运行,(注意LAPTOP-595LBSCH-bin.000092是因为测试时候知道刚才的操作一定就在这个文件中,如果不知道就需要逐个打开多个binlog文件然后自己找你想要的那个时间点,)

mysqlbinlog -v --set-charset=utf8mb4 LAPTOP-595LBSCH-bin.000092 > output.txt

之后通过打开这个output.txt文件可能有部分乱码(乱码自己解决,如果实在解决不了只能猜了。),比如找到这一部分,意思就是将王五改成王五的操作,他们的执行行数在1109另一种办法就是在mysql中使用show binlog events in 'LAPTOP-595LBSCH-bin.000092';来查看binlog中的日志,

我们可以看到有4个数据,有写入数据,删除更新数据等,还有最后一个是drop table。

经过这些我们已经得到了想要的信息,数据库上次备份后的binlog开始时间应该是317也就是备份后的第一条ddl语句的begin时间,然后我们想要恢复到的时间是1109日志文件的名字叫做LAPTOP-595LBSCH-bin.000092也就是更新王五那步操作的commit行,之后就是将这个时间段内binlog记录的操作都输入到备份的数据库中

下面这部操作是在不登陆mysql的黑窗口运行的, | mysql -uroot -p<数据库密码>的意思就是将前面步骤操作的结果输入到后面的命令中

mysqlbinlog --no-defaults --start-position=317 --stop-position=1109 LAPTOP-595LBSCH-bin.000092 | mysql -uroot -p<数据库密码>

此时打开数据库就会发现,数据库已经成功恢复到了删表之前的状态了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把GRPC服务实现注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

springboot+mysql在线考试系统-计算机毕业设计源码82584

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&#xff0c;对如何通过计算…

Websocket助手

功能介绍 WS助手是WebSocket调试的开发工具&#xff0c;该客户端工具可以帮助开发人员快速连接到测试/生产环境&#xff0c;它可以帮助您监视和分析 Websocket 消息&#xff0c;并在开发过程中解决问题&#xff1b;可以模拟客户端实现与服务器的数据交互&#xff0c;并完成批量…

论文精读:HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face

HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face Status: Reading Author: Dongsheng Li, Kaitao Song, Weiming Lu, Xu Tan, Yongliang Shen, Yueting Zhuang Institution: 微软亚洲研究院&#xff08;Microsoft Research Asia&#xff09;, 浙江…

uniapp 对接 微信App/支付宝App 支付

相关文档&#xff1a;uni.requestPayment(OBJECT) | uni-app官网 示例代码&#xff1a; import qs from qsasync aliPay(){const { provider } await uni.getProvider({ service:payment })if(provider.includes(alipay)){uni.request({url:后端接口地址,data:{ //传参 },suc…

⌈ 传知代码 ⌋ 基于扩散模型的无载体图像隐写术

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

前端---闭包【防抖以及节流】----面试高频!

1.什么闭包 释放闭包 从以上看出&#xff1a;一般函数调用一次会把内部的数据进行清除--但是这种操作却可以一起保留局部作用域的数据 // 优点:1、可以读取函数内部的变量 2、让这些变量始中存在局部作用域当中 2.闭包产生的两种业务场景&#xff1a;防抖、节流 2.1防抖 举…

QGraphicsView实现简易地图16『爆炸效果』

前文链接&#xff1a;QGraphicsView实现简易地图15『测量面积』 一种简单的爆炸波扩散效果 动态演示效果&#xff1a; 静态展示图片&#xff1a; 核心代码&#xff1a; #pragma once #include "../AbstractGeoItem.h" #include "DataStruct/GeoData.h"…

sysbench压测mysql性能测试命令和报告

sysbench压测mysql性能测试命令和报告 一、安装sysbench工具二、创建测试数据库三、基于sysbench构造测试表和测试数据四、数据库性能测试1、数据库读写性能测试2、数据库读性能测试3、数据库删除性能测试4、数据库更新索引字段性能测5、数据库更新非索引字段性能测试6、数据库…

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…

十、通配符和正则表达式

10.1 通配符 通配符是由shell处理的, 它只会出现在 命令的“参数”里。当shell在“参数”中遇到了通配符 时&#xff0c;shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配&#xff1a;若符合要求的匹配存在&#xff0c;则进 行代换(路径扩展)&#xff1b;否则就将该通配…

Qt for android 获取USB设备列表(一)Java方式 获取

简介 QtActivity 作为 Qt 应用程序的入口点&#xff0c;负责启动和配置 Qt 应用程序的信息&#xff0c; 后面我们继承 QtActivity 做自定义控制&#xff0c;了解一下 Activity 生命周期概念&#xff0c; 因为 QtActivity 继承自Android的activity&#xff0c;使用周期函数完成我…

java8新特性——函数式编程详解

目录 一 概述1.1 背景1.2 函数式编程的意义1.3 函数式编程的发展 Lambda表达式1.1 介绍1.2 使用Lambda的好处1.3 Lambda方法1.3.1 Lambda表达式结构1.3.2 Lambda表达式的特征 1.4 Lambda的使用1.4.1 定义函数式接口1.4.2 Lambda表达式实现函数式接口1.4.3 简化Lambda表达式1.4.…

C++学习/复习4--与类相关的概念/默认成员函数/运算符重载/Date类实现案例

一、类和对象 1.本章概要 2.C中的结构体(struct与class) 升级为类 &#xff08;1&#xff09;类及成员函数的两种定义方式 声明与定义分离 &#xff08;2&#xff09;权限 注意1&#xff1a;struct/class在权限上的区别 &#xff08;3&#xff09;封装 &#xff08;4&#x…

《Ai学习笔记》自然语言处理 (Natural Language Processing):机器阅读理解-基础概念解析01

自然语言处理 (Natural Language Processing)&#xff1a; NLP四大基本任务 序列标注&#xff1a; 分词、词性标注 分类任务&#xff1a; 文本分类、情感分析 句子关系&#xff1a;问答系统、对话系统 生成任务&#xff1a;机器翻译、文章摘要 机器阅读理解的定义 Machi…

《安富莱嵌入式周报》第337期:超高性能信号量测量,协议分析的开源工具且核心算法开源,工业安全应用的双通道数字I/O模组,低成本脑机接口,开源音频合成器

周报汇总地址&#xff1a;http://www.armbbs.cn/forum.php?modforumdisplay&fid12&filtertypeid&typeid104 视频版&#xff1a; https://link.zhihu.com/?targethttps%3A//www.bilibili.com/video/BV1PT421S7TR/ 《安富莱嵌入式周报》第337期&#xff1a;超高性…

【Spring Boot】分层开发 Web 应用程序(含实例)

分层开发 Web 应用程序 1.应用程序分层开发模式&#xff1a;MVC1.1 了解 MVC 模式1.2 MVC 和三层架构的关系 2.视图技术 Thymeleaf3.使用控制器3.1 常用注解3.1.1 Controller3.1.2 RestController3.1.3 RequestMapping3.1.4 PathVariable 3.2 将 URL 映射到方法3.3 在方法中使用…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好&#xff0c;我是jiaoxingk 本篇文章主要讲解如何安装虚拟机&#xff0c;并且在虚拟机中安装centos系统&#xff0c;让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前&#xff0c;我们先做虚拟机的介绍 虚拟机&#xff1a;通过软件虚拟出来的…

Docker拉取镜像报错:x509: certificate has expired or is not yet v..

太久没有使用docker进行镜像拉取&#xff0c;今天使用docker-compose拉取mongo发现报错&#xff08;如下图&#xff09;&#xff1a; 报错信息翻译&#xff1a;证书已过期或尚未有效。 解决办法&#xff1a; 1.一般都是证书问题或者系统时间问题导致&#xff0c;可以先执行 da…