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