如何恢复mysql数据库执行delete整表后的数据

作者:

在

问题背景

最近在删除数据的时候,把user表的数据给直接delete掉了,整表删除掉了。用户数据没了,用户再使用微信登陆上去,用户的其他表数据都关联不上。我得想法子把数据恢复。

处理思路

使用百度等搜索引擎搜索到的恢复数据方法,都是针对采用了where条件的。所以看到的处理手段是从mysql binlog中提取到一段时间的sql脚本,再把脚本执行一下。

示例说明网上的处理思路,针对where条件的

比如,17点到18点新增了一条数据,19点不小心删除了。从binlog中提交到17点到18点的sql脚本,再执行对应的sql脚本补全被删数据。

我的处理实操

我的潜在需求,我需要保持恢复后的user_id不变,确保数据关联性得到恢复。

处理流程:

第一步,使用mysql自带的binlog工具,将binlog所有日志中关于指定数据库的脚本全部导出,命名为full.sql

第二步,写bash脚本,将包括user表的sql语句过滤到新的文件user.sql

第三步,分析user.sql语句发现,里面有inser语句,也有update语句。从user id字段上来看,有一些user记录的inser语句并没有在里面体现。也就是这个数据库的binlog日志没有包括所有日志。这个数据库中途有迁移过。不过,这个不是问题。

3.1 我们可以非常确定的是,每个用户登陆以及后需操作都会产生udate语句更新。所以,insert语句可以全部忽略。于是,再写bash脚本,将user.sql过滤为仅包括update的sql文件only_update_user.sql

3.2 由于update语句非常多,包括了非常多的更新geo数据的update语句,显然对于恢复数据没有意义,进一步将only_update_user.sql过滤为no_geo_update_user.sql

3.3 我们从数据库中其他表的数据中分析出user id的最大值为xxx,于是我们重建一个user表,确保user id自增从1开始,写一个sql自动插入xxx条user记录。

3.4 执行no_geo_update_user.sql将用户信息恢复

结果

非常开心,数据恢复如初。

工具

遇到语句不会写,可以使用AI工具deepseek生成,用ai工具生成bash脚本也是比较省心,不用网上找来找去

网上找到的提取mysql binlog语句一段都是指定了具体的binlog文件名的,可以使用文件名通配符*实现提取所有的binlog信息

总结

遇到不小心删除了mysql数据,可以通过mysql自带的工具将binlog导出sql脚本,再分析sql脚本恢复数据。当然,在执行sql操作之前,能备份更好。恢复数据比较废时间,不值得。有备份更省心。

评论

发表回复