ITPub博客

首页 > 数据库 > MySQL > 记一次MySQL UPDATE DELETE误删除恢复案例分析

记一次MySQL UPDATE DELETE误删除恢复案例分析

原创 MySQL 作者:龙山游龙 时间:2025-01-06 16:06:16 0 删除 编辑

1 、 MyFlash 介绍

MyFlash 是一个回滚 DML 操作的工具,该工具是开源的。通过该工具,可以实现 MySQL 数据库误操作的闪回。

2 、安装 MyFlash

安装 git gcc glib-2.0

yum install -y git gcc glib2 libgnomeui-devel

下载 MyFlash 镜像

git clone https://gitee.com/wufengsheng/MyFlash.git

cd MyFlash

动态编译链接安装

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

MyFlash 常用选项解析

[root@localhost MyFlash]# pwd

/home/MyFlash

[root@localhost MyFlash]# ./flashback --help

语法解析:

--databaseNames : 需要闪回的数据库名称,如果有多个数据库,用逗号” ,” 隔开。

--tableNames : 要闪回的表名称,如果有多个表,用逗号”,” 隔开。

--start-position :闪回的起始位置,如不指定,从文件开始处回滚。

--stop-position : 闪回的终止位置,如不指定,回滚到文件结尾。

--start-datetime : 闪回的开始时间。

--stop-datetime : 闪回的终止时间。

--sqlTypes : 指定需要回滚的sql 类型,支持INSERT 、UPDATE 、DELETE ,多个类型使用逗号”,” 分开。

--maxSplitSize : 对文件进行固定尺寸的切割,以防止单次应用binlog 尺寸较大,对线上造成压力。

--binlogFileNames : 指定需要回滚的binlog 文件,美团文档说目前只支持单个binlog 文件,经测试已经支持多个binlog 文件同时闪回。

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

logLevel : 仅供开发者使用,默认级别为error 级别。在生产环境中不要修改这个级别,否则输出过多。

include-gtids : 指定需要回滚的gtid, 支持gtid 的单个和范围两种形式。

exclude-gtids : 指定不需要回滚的gtid ,用法同include-gtids 。

 

3 、误操作恢复测试环境

数据库版本:MySQL8.0.26

操作系统版本:Centos 7.9

4 、 update 误操作恢复

原表 province_info 数据如下

另一个张备份表 province_info_bak 数据如下

我们需要将 province_info 的字段 province_name 内容与 province_info_bak 改成一样

执行了如下误操作语句

root@localhost:testdb 15:12:09> update province_info,province_info_bak set province_info.province_name=province_info_bak.province_name;

 

误操作后的结果如下

恢复过程

确认 update 误操作时间,找到对应 binlog 文件,获取准确的开始和结束 pos ,不要选择 GTID 的 pos 点

mysqlbinlog  --no-defaults -v -v  --base64-output=DECODE-ROWS mysql-bin.000021  | grep -C 15 'province_info'

进行 update 误操作 SQL 反解析,生成解析后的二进制日志文件

./flashback --databaseNames=testdb --tableNames=province_info --sqlTypes='UPDATE' --start-position=4553 --stop-position=5906  --binlogFileNames=/data/mysql/mysql8.0.26/logs/mysql-bin.000021  --outBinlogFileNameBase=province_info

恢复数据

[root@localhost binary]# /data/mysql/mysql8.0.26/bin/mysqlbinlog --skip-gtids=true  province_info.flashback | /data/mysql/mysql8.0.26/bin/mysql -uroot -pjXSXlLHkSHnoMp78UYKy -A -S /data/mysql/mysql8.0.26/mysql.sock -P3307

确认数据是否恢复

5 、 delete 误操作

执行了如下误操作语句

root@localhost:testdb 16:19:44>delete from province_info where id between 1 in 17;

恢复过程

确认 delete 误操作时间,找到对应 binlog 文件,获取准确的开始和结束 pos ,不要选择 GTID 的 pos 点

/data/mysql/mysql8.0.26/bin/mysqlbinlog  --no-defaults -v -v  --base64-output=DECODE-ROWS mysql-bin.000021  | grep -C 100  'province_info'  | grep -C 15 'DELETE'

进行 delete 误操作 SQL 反解析,生成解析后的二进制日志文件

[root@localhost binary]# ./flashback --databaseNames=testdb --tableNames=province_info --sqlTypes='DELETE' --start-position=7971 --stop-position=8447  --binlogFileNames=/data/mysql/mysql8.0.26/logs/mysql-bin.000021  --outBinlogFileNameBase=province_info_delete

恢复数据

[root@localhost binary]# /data/mysql/mysql8.0.26/bin/mysqlbinlog --skip-gtids=true  province_info_delete.flashback   | /data/mysql/mysql8.0.26/bin/mysql -uroot -pjXSXlLHkSHnoMp78UYKy -A -S /data/mysql/mysql8.0.26/mysql.sock -P3307

验证数据是否恢复

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30310891/viewspace-3062373/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
传统商业、开源和国产据库领域十从业经验,TB级高并发数据库的管理经验。对于数据库内部原理、体系结构,数据页/块结构原理有着深刻认识;对于数据库新特性、分布式高可用架构和性能调优有着丰富的的实战经验。擅长故障诊断以及数据库异常打开及数据灾难挽救。

注册时间:2015-06-28

  • 博文量
    178
  • 访问量
    334653