翼度科技»论坛 编程开发 mysql 查看内容

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

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
一、MyFlash
  1. MyFlash
复制代码
是由美团点评公司技术工程部开发并维护的一个开源工具,主要用于
  1. MySQL
复制代码
数据库的
  1. DML
复制代码
操作的回滚。这个工具通过解析
  1. binlog
复制代码
日志,帮助用户高效、方便地进行数据恢复。
  1. MyFlash
复制代码
的优势在于它提供了更多的过滤选项,使得回滚操作变得更加容易。与其他数据恢复工具相比,
  1. MyFlash
复制代码
无需将
  1. binlog
复制代码
解析成文本再进行转换,而是提供了基于库、表、
  1. SQL
复制代码
类型、位置、时间等多种过滤方式。
  1. GitHub
复制代码
地址如下:
  1. <a href="https://gitcode.com/Meituan-Dianping/MyFlash?utm_source=csdn_github_accelerator&isLogin=1" rel="external nofollow"  target="_blank">https://github.com/Meituan-Dianping/MyFlash</a>
复制代码
本文将实验通过
  1. MyFlash
复制代码
工具快速恢复误删除 或 误修改的数据。
注意:要使用
  1. MyFlash
复制代码
,前提需要将
  1. MySQL
复制代码
  1. binlog
复制代码
格式改为
  1. row
复制代码
,且
  1. binlog_row_image=full
复制代码
,所以在下面实验前,请确保
  1. MySQL
复制代码
开启了
  1. binlog
复制代码
,并且
  1. binlog
复制代码
的格式正确:
  1. show variables like 'log_bin';
复制代码
  1. SHOW VARIABLES LIKE 'binlog_row_image';
复制代码


二、MyFlash 部署

安装依赖环境:
  1. yum install gcc glib2-devel -y
复制代码
下载
  1. MyFlash
复制代码
项目:
  1. wget https://github.com/Meituan-Dianping/MyFlash/archive/master.zip
复制代码
解压:
  1. unzip master.zip
复制代码
编译源文件:
  1. cd MyFlash-master
复制代码
  1. gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback
复制代码
查看
  1. flashback
复制代码
命令:
  1. ./binary/flashback -h
复制代码

解释如下:

  • databaseNames:指定需要回滚的数据库名。多个数据库可以用
    1. ,
    复制代码
    隔开。如果不指定该参数,相当于指定了所有数据库。
  • tableNames:指定需要回滚的表名。多个表可以用
    1. ,
    复制代码
    隔开。如果不指定该参数,相当于指定了所有表。
  • start-position:指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚。
  • stop-position:指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚。
  • start-datetime:指定回滚的开始时间。注意格式必须是
    1. %Y-%m-%d %H:%M:%S
    复制代码
    。如不指定,则不限定时间。
  • stop-datetime:指定回滚的结束时间。注意格式必须是
    1. %Y-%m-%d %H:%M:%S
    复制代码
    。如不指定,则不限定时间。
  • sqlTypes:指定需要回滚的
    1. sql
    复制代码
    类型。目前支持的过滤类型是
    1. INSERT
    复制代码
    ,
    1. UPDATE
    复制代码
    ,
    1. DELETE
    复制代码
    。多个类型可以用
    1. ,
    复制代码
    隔开。
  • maxSplitSize:指定解析分割后文件最大大小,单位为
    1. M
    复制代码

  • binlogFileNames:指定需要回滚的
    1. binlog
    复制代码
    文件,如有多个,用
    1. ,
    复制代码
    隔开。
  • outBinlogFileNameBase:指定输出的
    1. binlog
    复制代码
    文件前缀,如不指定,则默认为
    1. binlog_output_base.flashback
    复制代码

  • logLevel:指定输出的日志级别,可选级别有
    1. debug
    复制代码
    ,
    1. warning
    复制代码
    ,
    1. error
    复制代码
    ,默认级别为
    1. error
    复制代码
    级别。
  • include-gtids:指定需要回滚的
    1. gtid
    复制代码
    ,支持
    1. gtid
    复制代码
    的单个和范围两种形式,如有多种形式,用
    1. ,
    复制代码
    隔开。
  • exclude-gtids:指定不需要回滚的
    1. gtid
    复制代码
    ,支持
    1. gtid
    复制代码
    的单个和范围两种形式,如有多种形式,用
    1. ,
    复制代码
    隔开。

三、测试环境构建

创建测试库:
  1. create database testdb;
复制代码
  1. use testdb;
复制代码
创建测试表:
  1. CREATE TABLE `user` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(255) DEFAULT NULL,
  4.   `age` int(11) DEFAULT NULL,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码
写入测试数据:
  1. INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (1, '张三', 16);
  2. INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (2, '赵六', 17);
  3. INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (3, '李四', 18);
  4. INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (4, '小明', 19);
  5. INSERT INTO `testdb`.`user` (`id`, `name`, `age`) VALUES (5, '小李', 20);
复制代码
四、数据误删除恢复

假设不小心删除了
  1. age > 17
复制代码
的数据:
  1. delete from user where age > 17;
复制代码

查看当前
  1. binlog
复制代码
名称:
  1. show master status;
复制代码

先生成一个新的
  1. binlog
复制代码
文件,让后面的操作记录在新的
  1. binlog
复制代码
文件中:
  1. flush logs;
复制代码

使用
  1. MyFlash
复制代码
反向解析刚才的
  1. mysql-bin.000004
复制代码
文件,这个可以根据时间范围定位,
  1. sqlTypes
复制代码
  1. DELETE
复制代码
类型:
  1. ./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
复制代码

执行后可以看到生成了一个
  1. user.sql.flashback
复制代码
回滚文件,可以使用
  1. mysqlbinlog
复制代码
进行查看:
  1. mysqlbinlog -vv user.sql.flashback
复制代码

可以看出内容是
  1. INSERT
复制代码
操作,用来恢复之前误删除的数据,下面可以直接使用
  1. mysqlbinlog
复制代码
去执行其中的内容:
  1. mysqlbinlog user.sql.flashback | mysql -uroot -proot
复制代码

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

数据成功恢复!

五、数据误修改恢复

假设修改数据时忘了加
  1. where
复制代码
条件,导致所有数据都被误修改:
  1. update user set age = 99;
复制代码

下面做法和上面相似,首先查看当前
  1. binlog
复制代码
名称:
  1. show master status;
复制代码

同样生成一个新的
  1. binlog
复制代码
文件,让后面的操作记录在新的
  1. binlog
复制代码
文件中:
  1. flush logs;
复制代码

使用
  1. MyFlash
复制代码
反向解析刚才的
  1. mysql-bin.000005
复制代码
文件,这个还是根据时间范围定位,
  1. sqlTypes
复制代码
要改为
  1. UPDATE
复制代码
类型:
  1. ./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
复制代码

执行后可以看到生成了一个
  1. user1.sql.flashback
复制代码
回滚文件,使用
  1. mysqlbinlog
复制代码
进行查看:
  1. mysqlbinlog -vv user1.sql.flashback
复制代码

可以看出是
  1. UPDATE
复制代码
操作,用来恢复之前误修改的数据,同样直接使用
  1. mysqlbinlog
复制代码
去执行其中的内容:
  1. mysqlbinlog user1.sql.flashback | mysql -uroot -proot
复制代码

下面查看数据是否恢复:

数据成功恢复!
以上就是MySQL使用MyFlash快速恢复误删除和修改的数据的详细内容,更多关于MySQL MyFlash恢复误删除数据的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/database/322745b4e.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具