前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >头大了,Mysql写入数据十几秒后被自动删除了

头大了,Mysql写入数据十几秒后被自动删除了

作者头像
每周聚焦
发布于 2022-12-26 07:37:02
发布于 2022-12-26 07:37:02
97900
代码可运行
举报
文章被收录于专栏:每周聚焦每周聚焦
运行总次数:0
代码可运行

背景

事情是这样的,在公司内部新开发了一个功能还没有上线,目前部署在测试环境,Node服务会开启一个定时任务,每5分钟会处理好一部分数据写入到mysql数据库中。

在这之前,一切都运行正常,中秋节后上班第一天打开后台系统发现没有数据展示了,然后查询数据库发现历史存储的数据都没了,没了。现在只会存储最新的定时任务执行后的数据。可在此之间没有修改过任何代码,这个就神奇了。

头疼时间

查看写入的数据始终都只会存储最新的数据,则检查是否没有触发更新的逻辑,全部都命中新增的逻辑。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 方式创建数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.Model.bulkCreate(list)
复制代码

修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (const item of list) {
  this.Model.create(item)     
}
复制代码

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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等很多服务端相关的知识。最后的总结是遇到问题先不要质疑代码,从系统层面,运行版本,环境变量,运维等方面也要有一定的思考🤔。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Node】sequelize 使用对象的方式操作数据库
本文分享 sequelize 的项目实践经验,如果你还不了解 sequelize,可以先看文档
神仙朱
2022/04/12
8.9K0
【Node】sequelize 使用对象的方式操作数据库
分库分表—4.数据迁移系统文档一
(3)binlog消息消费记录表——etl_binlog_consume_record
东阳马生架构
2025/02/19
970
分布式事务 TCC-Transaction 源码分析 —— 事务恢复
1. 概述 本文分享 TCC 恢复。主要涉及如下二个 package 路径下的类: org.mengyun.tcctransaction.recover RecoverConfig,事务恢复配置接口
芋道源码
2018/03/27
1.3K0
分布式事务 TCC-Transaction 源码分析 —— 事务恢复
【腾讯云CDB】如何快速删除InnoDB中的大表
本文介绍了MySQL DROP TABLE操作可能存在的性能瓶颈,包括InnoDB引擎表、MyISAM引擎表、以及操作系统层面的限制。针对这些瓶颈,本文提出了相应的优化方案,包括增大InnoDB缓冲池、使用MyISAM存储引擎、以及调整操作系统相关参数。通过这些优化方案,可以有效地提升MySQL数据库的性能,减少DROP TABLE操作对数据库性能的影响。
腾讯云数据库 TencentDB
2017/12/14
4.1K1
干货 | 数据为王,携程国际火车票的Sharding-Sphere之路
随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐渐显露,常规的数据库优化已无法达到期望的效果。同时,原先的底层数据库设计,也存在一些历史遗留问题,比如存在部分无用字段、表通过自增主键关联和各个应用直连数据库等问题。
携程技术
2021/09/10
1.5K0
干货 | 数据为王,携程国际火车票的Sharding-Sphere之路
yii2使用Migrations为整个数据库表创建迁移
本教程为整个数据库表进行创建迁移,弥补以前未做的工作,且仅适合于Migrations(2.0.8)版本用户及以上。
botkenni
2019/09/02
2.1K0
基于Redis实现延时队列服务
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
4410
一次大量删除导致 MySQL 慢查的分析
当慢查在执行的时候,大部分的都是表现在 Sending data 的状态,我们通过 profiling 去确认下慢查的时间分布:
用户1278550
2019/05/17
1.3K0
MySQL存储过程与定时删表
在工业监控里面,需要对每天的数据,进行记录,时间长了之后,MySQL数据库很容易撑爆。这时候,如果允许可以对之前的数据进行一次清除,只记录几个月内的数据。
星哥玩云
2022/08/18
1.6K0
有趣的MySQL(三):更新“丢失”问题
  趁着这几天过节,复盘了一下去年的一些历史遗留问题,其中有这样一个关于数据库的小问题让我忍不住翻出来又回味了一下,下面就让我们一起品味品味。
闲宇非鱼
2022/02/08
2K0
有趣的MySQL(三):更新“丢失”问题
Redis与MySQL的数据情感:延迟双删的秘密揭示
在现代应用程序中,MySQL 和 Redis 是两种常用的数据存储解决方案。然而,它们之间的数据不一致性问题一直是开发人员头痛的难题。Redis 延迟双删是一种有趣的技术,能够解决这一难题,本篇博客将带你深入了解如何使用它来确保 MySQL 与 Redis 数据的一致性,就像一场奇迹一样。
一只牛博
2025/05/30
890
Redis与MySQL的数据情感:延迟双删的秘密揭示
工作中遇到的一些坑(1)
好快啊,又是一周的轮回,本来打算把本周遇到的问题展开一个一个总结的,但是奈何踩的坑是在有点多,展开来根本没时间搞,索性就搞了这个类似周报的东西。希望从这一周开始,每一周都能坚持下来喽。
mythsman
2022/11/14
4211
定期删除客户数据库索引,手动制造慢查询来迫使客户加钱优化?小作坊下料就是猛
今天在逛论坛的时候,发现了一个极其逆天的帖子:该发帖人的客户购买了一个软件,发现这个软件对应的数据库会定期检测当前的索引然后进行删除。
程序员牛肉
2025/02/27
681
定期删除客户数据库索引,手动制造慢查询来迫使客户加钱优化?小作坊下料就是猛
京东618大促压测时自研中间件暴露出的问题总结,压测数值40w/s
前天618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了2500台服务器,每秒大概接收几千个key探测,每天大概2-4亿左右,因为量很小,所以框架表现稳定。借着这次压测,刚好可以检验一下热key框架在大流量时的表现。毕竟作为一个新的中间件,里面很多东西还是第一次用,免不得会出一些问题。
天涯泪小武
2020/05/14
8860
京东618大促压测时自研中间件暴露出的问题总结,压测数值40w/s
深度剖析如何实现事务消息
分布式事务一直是一个老生常谈的一个话题,在我的公众号下面下面已经写过很多篇分布式事务相关的文章了,但是依旧没有将其完全剖析。在之前的文章中我也多次提到我们可以使用消息队列来实现我们的分布式事务,但是大多都是一笔带过,很多读者都对这一块产生了很多疑问,希望读完这篇文章能让你理解如何用消息队列实现分布式事务。
用户5397975
2020/01/14
5590
深度剖析如何实现事务消息
高逼格企业级MySQL数据库备份方案,原来是这样....
很多人,这里说的是运维工程师们,一提到写某某方案,很是头疼。不是上某度一统搜索,就是同样一句话在N个群全部群发一遍:“有没有某某方案,可以共享一下的吗??求助,各位大佬们”,估计十有八九,全部石沉大海,杳无音讯。
数据和云
2019/05/29
1.6K0
万字长文揭秘37手游的自研任务调度平台
在 37 手游内部,「统一任务调度平台」用于管理常驻进程和调度定时任务,以确保它们按照预定的计划运行。
37手游后端技术团队
2023/03/23
7020
万字长文揭秘37手游的自研任务调度平台
你真的懂MySQL的事务隔离机制吗?
若想更改,可将启动参数transaction-isolation的值set成READ-COMMITTED。
JavaEdge
2021/02/22
1.1K0
你真的懂MySQL的事务隔离机制吗?
【愚公系列】《微信小程序与云开发从入门到实践》049-使用云函数
在微信小程序的开发过程中,如何高效地处理业务逻辑和实现复杂功能是每位开发者面临的挑战。云函数作为一种灵活、高效的无服务器计算解决方案,为小程序提供了强大的后台支持,使得开发者能够在云端运行代码,而无需关心服务器的管理与维护。这种架构不仅简化了开发流程,还提升了应用的可扩展性和安全性。
愚公搬代码
2025/01/28
3220
mysql定时备份任务
在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份。而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份。首先我们来简单了解crontab指令,如果你会了请跳到下一个内容mysql备份。 本文章的mysql数据库是安装在docker容器当中,以此为例进行讲解。没有安装到docker容器当中也可以参照参照。
Johnson木木
2020/06/23
2.1K0
推荐阅读
相关推荐
【Node】sequelize 使用对象的方式操作数据库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验