头大了,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写入数据十几秒后被自动删除了的主要内容,如果未能解决你的问题,请参考以下文章

连接wifi后十几秒后自动断开?

停发薪水三个月后被解雇,程序员删除系统数据予以反击

sql server编写archive通用模板脚本实现自动分批删除数据

Mysql 删除从数据库的relay logs最佳方式最安全方式

tomcat 新手提问,已经头大了

MongoDB node.js:10秒后自动删除文档