Mysql版本:8.0.39-0ubuntu0.22.04.1 其他版本理论支持,需要试验~

前提条件:

  • Mysql开启binlog
1
SHOW VARIABLES LIKE 'log_bin';

  • binlog格式为row
1
SHOW VARIABLES LIKE 'binlog_format';

  • binlog_row_image为FULL
1
SHOW VARIABLES LIKE 'binlog_row_image';

定位binlog位置及确认当前binlog

1
SHOW VARIABLES LIKE '%log_bin_basename%';
Variable_nameValue
log_bin_basename/var/lib/mysql/binlog

此处说明binlog的存放路径为/var/lib/mysql/

1
SHOW MASTER STATUS;
FilePosition
binlog.000005791631

此处说明当前binlog为binlog.000005

通过mysqlbinlog转换binlog,并查找关键字

1
2
3
sudo mysqlbinlog /var/lib/mysql/binlog.000005 | less
# 接着输入 /表名 再回车,定位删除日志位置
# 如果查到了关键词但是并非删除日志,按 n 往下继续翻,查完按 q 退出

安装MyFlash

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 下载源码(https://github.com/Meituan-Dianping/MyFlash)
wget -O MyFlash-master.zip \
https://codeload.github.com/Meituan-Dianping/MyFlash/zip/refs/heads/master

# 解压源码
unzip MyFlash-master.zip

# 安装gcc
yum install gcc -y

# 编译
cd MyFlash-master 
chmod +x build.sh
./build.sh

使用MyFlash生成恢复数据库二进制文件

1
2
3
4
5
6
7
8
9
cd MyFlash-master/binary/

# sqlTypes:指定需要回滚的 sql 类型。目前支持的过滤类型是 INSERT, UPDATE, DELETE。此处指定“DELETE”
# start-position,stop-position为binlog中根据关键词查到的数字,根据上图得出为504664,553652
# binlogFileNames,例如:/root/binlog.000005
# 最后生成的文件为当前目录下的recover.log.flashback
./flashback --databaseNames="库名" --tableNames="表名" --sqlTypes="DELETE" \
--start-position=开始位置 --stop-position=结束位置 --binlogFileNames=binlog位置 \
--outBinlogFileNameBase=recover.log

如果使用了开始结束位置参数,执行此命令可能会出现报错Segmentation fault (core dumped),解决方案为删除开始、结束位置参数,等处理完后再手工筛除recover中数据

使用mysqlbinlog转换恢复文件并做数据导入

1
2
# 输入密码即可导入,无报错即导入成功
mysqlbinlog recover.log.flashback | sudo mysql -uroot -p

验证数据是否恢复