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

2024-06-16 00:36

本文主要是介绍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

在这里插入图片描述

下面查看数据是否恢复:

在这里插入图片描述

数据成功恢复!

这篇关于MySQL 使用 MyFlash 快速恢复误删除、误修改数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065026

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.