头大了,Mysql写入数据十几秒后被自动删除了
Posted 南城FE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了头大了,Mysql写入数据十几秒后被自动删除了相关的知识,希望对你有一定的参考价值。
最近遇上了一件困扰了我好几天的一个问题,为此排查了一整天都无功而返,想到这感觉真对不起老板,一天一行代码没写,啥也没做成。
背景
事情是这样的,在公司内部新开发了一个功能还没有上线,目前部署在测试环境,Node服务会开启一个定时任务,每5分钟会处理好一部分数据写入到mysql数据库中。
在这之前,一切都运行正常,中秋节后上班第一天打开后台系统发现没有数据展示了,然后查询数据库发现历史存储的数据都没了,没了。现在只会存储最新的定时任务执行后的数据。可在此之间没有修改过任何代码,这个就神奇了。
头疼时间
查看写入的数据始终都只会存储最新的数据,则检查是否没有触发更新的逻辑,全部都命中新增的逻辑。
const isExist = await this.Model.findOne(
where:
projectId
);
if (isExist)
await isExist.destroy()
updateList.push(item)
else
createList.push(item)
现在的逻辑是将新增和更新分开处理,经检查发现所有的isExist都是null,导致全部命中新增的逻辑。可是数据库中明明是有数据的,为什么查询不出来呢?怀疑是有第三方数据存在脏数据之类的情况,所以我将数据库现存数据全部清空,重新写入查看效果。结果第一次写入是正常的,后续还是不会触发更新,经过查询发现每次写入数据库大约十几秒数据就被清空了。
可是在写入后的代码逻辑中是没有执行删除数据的处理,而且每次都是稳定复现,写入后就被删除了,查询无果无奈找到db帮找原因。db查询日志给出的结论就是有定时执行删除的逻辑。 看到日志只能继续在代码中找原因了。由于此时是使用的 sequelize 的 bulkCreate 批量创建数据,所以开始怀疑是不是这个批量处理的过程中出现了问题,当初是因为每次执行的数据量太多所以没有选择单条执行,这个时候为了排查问题,所以我改成了单条数据 create 方式创建数据。
this.Model.bulkCreate(list)
修改为
for (const item of list)
this.Model.create(item)
结果不出意外的还是定时被删除了,
以上是关于头大了,Mysql写入数据十几秒后被自动删除了的主要内容,如果未能解决你的问题,请参考以下文章
sql server编写archive通用模板脚本实现自动分批删除数据