背景

有一些项目比较久的项目使用的是mysql5.6的数据库,并且存储了一些业务数据,开发小伙伴因为某些旧项目的业务需求写了一个类似kettle的数据抽取的功能,结果程序跑批的时候,程序逻辑错误导致几个老项目的附件数据表清空了,引发项目的客户反馈无法查到历史的业务附件数据了。但是由于项目采用的是一天两次备份以及数据库开启了mysqlbinlog,因此可以通过就近时间点的备份数据+mysqlbinlog的方式恢复业务数据。

Tips:

  1. mysqlbinlog的开启方式自行搜索
  2. 本次恢复的mysql是mysql5.6.x,此方法在mysql5.7.x我记得是同样适用的,但是在mysql8.0之后的mysqlbinlog恢复方式会有所差异,请勿在mysql8.x轻易尝试!!

实现步骤

1.获取最近的备份文件

/tmp/xxx_20241125120000.sql

2.准备一个可供恢复的数据库实例并导入备份数据

mysql -h主机ip -u数据库用户名 -p数据库密码 -P数据库端口 -A
create database xxx;
source /tmp/xxx_20241125120000.sql;

3.找到附件业务表 file并生成备份文件

mysqldump  -h主机ip -u数据库用户名 -p数据库密码 -P数据库端口 xxx file>/tmp/file.sql

4.mysqlbinlog生成新增的业务sql

mysqlbinlog --user=恢复数据库的用户名 --password=恢复数据库的密码 --start-datetime="2024-11-25 12:00:00" --stop-datetime="2024-11-25 16:00:00" --database=xxx --result-file=/tmp/xxx_increase.sql binlog文件

awk '/insert into file/,/;\/*!*/' /tmp/xxx_increase.sql > /tmp/xxx_file_increase.sql

5.导出问题时间点之后产生的业务数据

mysqldump  -h主机ip -u恢复数据库的用户名 -p恢复数据库的密码 -P恢复数据库的端口 xxx file>/tmp/xxx_file_after_1600.sql

6.恢复数据即可完成

mysql -h主机ip -u数据库用户名 -p数据库密码 -P数据库端口 -A
use xxx;
source /tmp/file.sql;
source /tmp/xxx_file_increase.sql;
source /tmp/xxx_file_after_1600.sql;

Tips

因为数据的时间取值不一定完全准确,所以可能在导入数据的时候会存在 某个记录重复的情况,所以建议将生成的   
/tmp/xxx_file_increase.sql;
/tmp/xxx_file_after_1600.sql;
的  insert into 修改  replace into,避免数据的重复导致的source报错