一、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-mastergcc-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下面查看数据是否恢复:
数据成功恢复!