
问题背景
最近在删除数据的时候,把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操作之前,能备份更好。恢复数据比较废时间,不值得。有备份更省心。
发表回复
要发表评论,您必须先登录。