ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

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

一、MyFlash

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

GitHub地址如下:

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

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

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

showvariableslike'log_bin';

SHOWVARIABLESLIKE'binlog_row_image';

二、MyFlash 部署

安装依赖环境:

yuminstallgcc glib2-devel-y

下载MyFlash项目:

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

解压:

unzipmaster.zip

编译源文件:

cdMyFlash-master
gcc-w`pkg-config--cflags--libsglib-2.0`source/binlogParseGlib.c-obinary/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的单个和范围两种形式,如有多种形式,用,隔开。

三、测试环境构建

创建测试库:

createdatabasetestdb;
usetestdb;

创建测试表:

CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(255)DEFAULTNULL,`age`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

写入测试数据:

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

四、数据误删除恢复

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

deletefromuserwhereage>17;

查看当前binlog名称:

showmasterstatus;

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

flush logs;

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

./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-vvuser.sql.flashback

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

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

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

数据成功恢复!

五、数据误修改恢复

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

updateusersetage=99;

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

showmasterstatus;

同样生成一个新的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-vvuser1.sql.flashback

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

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

下面查看数据是否恢复:

数据成功恢复!

返回列表