MySQL 使用 MyFlash 快速恢复误删除、误修改数据

一、MyFlash

MyFlash 是由美团点评公司技术工程部开发并维护的一个开源工具,主要用于MySQL数据库的DML操作的回滚。这个工具通过解析binlog日志,帮助用户高效、方便地进行数据恢复。MyFlash的优势在于它提供了更多的过滤选项,使得回滚操作变得更加容易。与其他数据恢复工具相比,MyFlash无需将binlog解析成文本再进行转换,而是提供了基于库、表、SQL类型、位置、时间等多种过滤方式。

GitHub 地址如下:

https://github.com/Meituan-Dianping/MyFlash

本文将实验通过 MyFlash 工具快速恢复误删除 或 误修改的数据。

注意:要使用 MyFlash ,前提需要将 MySQLbinlog格式改为row,且 binlog_row_image=full,所以在下面实验前,请确保 MySQL 开启了 binlog ,并且 binlog 的格式正确:

show variables like 'log_bin';

在这里插入图片描述

SHOW VARIABLES LIKE 'binlog_row_image';

在这里插入图片描述

二、MyFlash 部署

安装依赖环境:

yum install gcc glib2-devel -y

下载 MyFlash 项目:

wget https://github.com/Meituan-Dianping/MyFlash/archive/master.zip

解压:

unzip master.zip

编译源文件:

cd MyFlash-master
gcc -w  `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c  -o binary/flashback

查看 flashback 命令:

./binary/flashback -h

在这里插入图片描述

解释如下:

  • databaseNames:指定需要回滚的数据库名。多个数据库可以用 , 隔开。如果不指定该参数,相当于指定了所有数据库。

  • tableNames:指定需要回滚的表名。多个表可以用 , 隔开。如果不指定该参数,相当于指定了所有表。

  • start-position:指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚。

  • stop-position:指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚。

  • start-datetime:指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。如不指定,则不限定时间。

  • stop-datetime:指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。如不指定,则不限定时间。

  • sqlTypes:指定需要回滚的 sql 类型。目前支持的过滤类型是 INSERT, UPDATE, DELETE。多个类型可以用 , 隔开。

  • maxSplitSize:指定解析分割后文件最大大小,单位为 M

  • binlogFileNames:指定需要回滚的 binlog 文件,如有多个,用 , 隔开。

  • outBinlogFileNameBase:指定输出的 binlog 文件前缀,如不指定,则默认为 binlog_output_base.flashback

  • logLevel:指定输出的日志级别,可选级别有 debug, warning, error,默认级别为 error 级别。

  • include-gtids:指定需要回滚的 gtid,支持 gtid 的单个和范围两种形式,如有多种形式,用 , 隔开。

  • exclude-gtids:指定不需要回滚的 gtid,支持 gtid 的单个和范围两种形式,如有多种形式,用 , 隔开。

三、测试环境构建

创建测试库:

create database testdb;
use testdb;

创建测试表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

写入测试数据:

INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (1, '张三', 16);
INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (2, '赵六', 17);
INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (3, '李四', 18);
INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (4, '小明', 19);
INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (5, '小李', 20);

四、数据误删除恢复

假设不小心删除了 age > 17 的数据:

delete from user where age > 17;

在这里插入图片描述

查看当前 binlog 名称:

show master status;

在这里插入图片描述

先生成一个新的 binlog 文件,让后面的操作记录在新的 binlog 文件中:

flush logs;

在这里插入图片描述

使用 MyFlash 反向解析刚才的 mysql-bin.000004 文件,这个可以根据时间范围定位,sqlTypesDELETE 类型:

./binary/flashback --databaseNames="testdb" --tableNames="user" --start-datetime="2024-06-15 14:35:30" --stop-datetime="2024-06-15 14:41:30"  --sqlTypes="DELETE" --binlogFileNames=/var/lib/mysql/mysql-bin.000004 --outBinlogFileNameBase=user.sql

在这里插入图片描述

执行后可以看到生成了一个 user.sql.flashback 回滚文件,可以使用 mysqlbinlog 进行查看:

mysqlbinlog -vv user.sql.flashback 

在这里插入图片描述

可以看出内容是 INSERT 操作,用来恢复之前误删除的数据,下面可以直接使用 mysqlbinlog 去执行其中的内容:

mysqlbinlog user.sql.flashback | mysql -uroot -proot

在这里插入图片描述

下面查看数据是否被恢复:

在这里插入图片描述

数据成功恢复!

五、数据误修改恢复

假设修改数据时忘了加 where 条件,导致所有数据都被误修改:

update user set age = 99;

在这里插入图片描述

下面做法和上面相似,首先查看当前 binlog 名称:

show master status;

在这里插入图片描述

同样生成一个新的 binlog 文件,让后面的操作记录在新的 binlog 文件中:

flush logs;

在这里插入图片描述

使用 MyFlash 反向解析刚才的 mysql-bin.000005 文件,这个还是根据时间范围定位,sqlTypes 要改为 UPDATE 类型:

./binary/flashback --databaseNames="testdb" --tableNames="user" --start-datetime="2024-06-15 14:45:30" --stop-datetime="2024-06-15 14:50:30"  --sqlTypes="UPDATE" --binlogFileNames=/var/lib/mysql/mysql-bin.000005 --outBinlogFileNameBase=user1.sql

在这里插入图片描述

执行后可以看到生成了一个 user1.sql.flashback 回滚文件,使用 mysqlbinlog 进行查看:

mysqlbinlog -vv user1.sql.flashback 

在这里插入图片描述

可以看出是 UPDATE 操作,用来恢复之前误修改的数据,同样直接使用 mysqlbinlog 去执行其中的内容:

mysqlbinlog user1.sql.flashback | mysql -uroot -proot

在这里插入图片描述

下面查看数据是否恢复:

在这里插入图片描述

数据成功恢复!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UC Berkeley简介以及和Stanford的区别与联系

UC Berkeley Source: Google Map 中文版 UC Berkeley,全称University of California, Berkeley,是一所位于美国加利福尼亚州伯克利市的世界知名公立研究型大学。以下是关于UC Berkeley的详细介绍: 学术声誉和排名 学术声誉: U…

欧洲杯德语词汇与表达,柯桥零基础德语培训

欧洲杯 - die Europameisterschaft 足球 - der Fuball 比赛 - das Spiel / die Partie 球员 - der Spieler 教练 - der Trainer 裁判 - der Schiedsrichter 球迷 - die Fans 进球 - das Tor 守门员 - der Torwart / der Torhter 前锋 - der Strmer 中场 - der Mittelf…

2024最值得入手骨传导耳机指南,精选五款分享!

作为前几年在蓝牙耳机市场杀出的一匹黑马,黑科技加持的骨传导耳机受到广大运动爱好者的喜爱。利用骨传导技术,通过头骨、颌骨把声音传到听觉神经引起听觉,同时又不阻碍外接声音的通过,保证了佩戴的舒适性也带来安全使用的最佳体验…

判断两张图片是否相似

判断两张图片是否相似 要判断两张图片是否相似,你可以使用多种方法,其中包括结构相似性指数(SSIM)和 perception hash 等。以下是使用 SSIM 和 perception hash 进行判断的示例代码。 安装必要的包 确保你已经安装了 scikit-im…

帕金森病的食疗建议

帕金森病(PD)是一种慢性、进展性的神经退行性疾病,主要影响中老年人。虽然目前尚无法根治,但及早规范治疗可显著改善症状,提高患者的生活质量。饮食调理作为帕金森病综合治疗的重要组成部分,对于维持患者较…

unity数独游戏

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MainMenuPanel : MonoBehaviour {public Button btnPlay; // 开始按钮public Slider sldDifficulty; // 难度滑动条private void Awake(){/…

RabbitMQ实践——利用一致性Hash交换器做带权重的调度

在《RabbitMQ实践——利用一致性Hash交换器做负载均衡》一文中,我们介绍了如何开启一致性hash交换器,并实现了消息的负载均衡,以达到横向扩展消费者数量的能力。 但是现实中,可能存在这样的场景:一些队列所在的机器配置…

【vue】终端 常用代码 和其他注意

🥑这里目录 一、【安装】1. 搜版本2.卸载3.安装 带版本4. 纯安装(自动最新) 二、【官网】官网源码及用法讲解1.【npm】2.【printjs】打印 一、【安装】 以下全拿 qrcode.vue 举例 1. 搜版本 例子:搜 qrcode.vue的版本代码&…

电子行业实施MES管理系统的时机是什么

随着信息技术的飞速发展,MES生产管理系统逐渐成为电子企业实现自动化生产和信息化管理的必备工具。那么,何时是电子企业实施MES管理系统的最佳时机呢? 1.生产过程中出现了问题,需要优化和改进。 2.企业需要提高产品交付和响应速…

短视频矩阵系统/源码搭建---拆解热门视频功能开发上线

短视频矩阵系统/源码搭建 一、短视频矩阵系统源码开发需要用到以下技术: 1.前端技术:HTML、CSS、JavaScript、Vue.js等前端框架。 2.后端技术:Java、Python、PHP等后端语言及相关框架,如Spring Boot、Django、Laravel等。 3.移…

算法day26

第一题 429. N 叉树的层序遍历 本题的要求我们可以通过队列来辅助完成层序遍历; 如下图的n叉树: 步骤一: 我们定义一个队列,先进行根节点入队列操作; 步骤二: 我们进行当前队列每一个元素的出队列操作&…

(科学:某天是星期几)泽勒一致性是由克里斯汀·泽勒开发的用于计算某天是星期几的算法。

(科学:某天是星期几)泽勒一致性是由克里斯汀泽勒开发的用于计算某天是星期几的算法。这个公式是: 其中: h是一个星期中的某一天(0 为星期六;1 为星期天;2 为星期一;3 为星期二;4 为 星期三;5 为星期四;6为星期五)。 q 是某月的第几天。 m 是月份(3 为三月,4 为四月,…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5400 标注数量(xml文件个数):5400 标注数量(txt文件个数):5400 标注…

去掉eslint

1、在vue.config.js文件里加上下面的代码,然后重启就可以了! 2、vue.config.js文件代码: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,lintOnSave: false })

Python基础教程(二十):SMTP发送邮件

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

MySQL -- 事务

MySQL事务是数据库操作的一个重要概念,事务是指一组操作要么全部完成,要么全部不完成,是数据库的一个逻辑工作单元。事务的主要目的是确保数据库的一致性和可靠性。 事务是一组SQL语句的执行,要么全部成功,要么全部失…

【踩坑】解决运行一段时间GPU计算后忽然变得很慢

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 发现问题 问题分析 修复思路 思路一 思路二 思路二对应代码 这个问题真的找了我好久,但说起来其实也简单,就是GPU温…

JDK8-17新特性

一、JDK8新特性:Lambda表达式 1.Lambda表达式及其使用举例 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力…

17个有用的CLI命令

作为前端开发工程师,我们需要了解哪些命令?如果您熟悉这些命令,它们将大大提高您的工作效率。 1. tree 你们知道如何列出一个目录的文件结构吗?它在显示文件之间的目录关系方面做得很好 commands ├── a.js ├── b.js ├── …

PyTorch计算机视觉入门:从官方数据集到自定义数据集的获取

一、PyTorch与计算机视觉简介 PyTorch是一个开源的深度学习框架,其动态图的特性非常适合快速实验和模型原型设计。在计算机视觉任务中,如图像分类、目标检测、图像分割等,PyTorch提供了丰富的API和预训练模型,帮助开发者快速搭建…