Mysql写入数据十几秒后被自动删除了如何解决

 更新时间:2022年09月15日 10:50:12   作者:南城FE​​​​​​​  
这篇文章主要介绍了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)
}

结果不出意外的还是定时被删除了,😭 然后开始怀疑是事务没有提交的问题,虽然此逻辑是完全不需要用到事务操作,但还是抱着怀疑的心态试试看。

let transaction;
try {
  // 建立事务对象
  transaction = await this.ctx.model.transaction();
  for (const item of list) {
    // 事务增操作
    await this.Model.create(item, {
        transaction,
    });
    // 提交事务
    await transaction.commit();
  }
} catch (err) {
    // 事务回滚
    await transaction.rollback();
}

结果不出意外的还是定时被删除了,😭😭😭此时已经没有改动的余地了,此时的天都已经黑了,可是问题还没解决,只能继续面向百度编程了,此时搜索到也有同一个人遇到这样的问题,他的解决方案是修改表名称,这时候也只能死马当作活马医了。

结果出意外的恢复正常写入以及更新了。

为什么更改了表名称后就正常呢,思来想去也想不出为什么。结果今天在重新部署服务的时候看了一眼历史部署记录,发现了端倪。就在假期的最后一天晚上有一个部署记录,然后我回看了和最开始发生数据异常的时间段相差无几。基本就可以断定和此次部署有很大的关系,由于公司内部的部署方案有docker和虚拟机两种方式,导致每个时间段都会有两个定时任务同时执行,由于数据处理的过程中需要查询第三方数据,最后两边写入的时间会存在一定的延时,导致写好的数据被另一边执行了删除的逻辑,由于那台服务器一直未更新修改的代码,一直执行的是最开始那份先删除再更新的逻辑。至于为啥执行了删除但是没有更新,猜想是删除后更新的逻辑出错了。这也是为什么修改了表名称后就正常了,因为那台服务器上面还是旧的代码,新增删除不能读到之前的那张表了,问题到此终于是告一段落了。

总结

到此是否感觉看了一个大乌龙事件,最终的原因和代码没有任何关系,但是却三番五次的改动无果。在排查过程中还有很多没有写的,比如怀疑重复数据导致所以增加唯一索引,怀疑自增ID多大重新清零,但是这个改动的过程中也学到了不少新的知识,如何使用事务,新增唯一索引,修改表名称,重置自增ID等很多服务端相关的知识。最后的总结是遇到问题先不要质疑代码,从系统层面,运行版本,环境变量,运维等方面也要有一定的思考

到此这篇关于Mysql写入数据十几秒后被自动删除了如何解决的文章就介绍到这了,更多相关Mysql数据自动删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis特殊字符处理的详解

    Mybatis特殊字符处理的详解

    这篇文章主要介绍了Mybatis特殊字符处理的详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • mysql root用户的密码修改和消除

    mysql root用户的密码修改和消除

    本文主要针对于Windows环境下root用户密码的修改以及密码的消除
    2009-06-06
  • MySQL 日期格式化的使用示例

    MySQL 日期格式化的使用示例

    在MySQL中,可以使用DATE_FORMAT函数对日期进行格式化,本文就来介绍一下MySQL 日期格式化的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的简单实现方法

    以下是对EXCEL数据上传到SQL SERVER中的简单实现方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • Mysql中的复合查询详解

    Mysql中的复合查询详解

    这篇文章主要介绍了Mysql中的复合查询的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 探究MySQL优化器对索引和JOIN顺序的选择

    探究MySQL优化器对索引和JOIN顺序的选择

    这篇文章主要介绍了探究MySQL优化器对索引和JOIN顺序的选择,包括在优化器做出错误判断时的选择情况,需要的朋友可以参考下
    2015-05-05
  • mysql数据库常见的优化操作总结(经验分享)

    mysql数据库常见的优化操作总结(经验分享)

    这篇文章主要给大家介绍了关于mysql数据库常见的优化操作,文章总结的都是个人日常开发使用mysql数据库的经验所得,其中包括Index索引、少用SELECT*、EXPLAIN SELECT以及开启查询缓存等相关资料,相信会对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • mysql 使用存储过程实现树节点的获取方法

    mysql 使用存储过程实现树节点的获取方法

    这篇文章主要介绍了mysql 使用存储过程实现树节点的获取方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 通过案例分析MySQL中令人头疼的Aborted告警

    通过案例分析MySQL中令人头疼的Aborted告警

    这篇文章通过案例跟大家分析了MySQL中令人头疼的Aborted告警的相关资料,文中将Aborted告警介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • MySQL监控Innodb信息工作流程

    MySQL监控Innodb信息工作流程

    这篇文章主要为大家介绍了MySQL监控Innodb信息工作流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-02-02

最新评论