一起数据库中过期用户数据堆积问题的排查过程

简介: 【文章摘要】对于使用数据库来存放大量用户的软件来说,过期数据的清理机制需要慎重设计。如果设计不当,则会导致数据的误删除或清理不完全。本文对某数据清理模块因参数配置不当而导致的过期用户数据堆积问题进行了详细的分析,为相关软件问题的分析及解决提供了有益的参考。

【文章摘要

对于使用数据库来存放大量用户的软件来说,过期数据的清理机制需要慎重设计。如果设计不当,则会导致数据的误删除或清理不完全。

本文对某数据清理模块因参数配置不当而导致的过期用户数据堆积问题进行了详细的分析,为相关软件问题的分析及解决提供了有益的参考。

 

一、问题描述

在某软件系统中,为了让不同种类的用户享受对应的服务,引入了一个信箱服务等级的概念,即不同服务等级的用户具有不同的权限。“一分钱,一分货”,对于运营商来说,高服务等级的用户收取高的资费,提供高质量的服务。

为了维护不同用户的信息,在数据库中建立了用户数据表,表中包含了用户号码(如手机号)、状态(如正常使用、停用、欠费等)、服务等级(称作cos值)、用户属性(A或B类用户)等字段。

近期,该软件系统的某商用局点的支持人员反馈回一个问题:数据库中过期用户数据堆积,很多本该被删除掉的数据依然存在。

 

二、问题原因初步分析

在该软件系统中,有一个过期数据清理模块专门用于清理过期用户数据。既然数据库中出现了大量未被删除的过期用户数据,那么一定是这个模块出了问题。

我们让现场的支持人员将使用的数据库打包返回,并在开发小组的自测数据库中将数据恢复了。我们查看了用户数据表,发现的确有大量过期用户数据还保存在数据库中的。那么,这些本该删除的数据有什么特点呢?

我们对部分过期用户数据进行了观察,发现它们具有以下两个方面的特点:

第一,某个cos值对应的过期用户数据特别多,占到了未被清理的数据量的80%以上。

第二,未被删除的过期用户数据的用户属性大多为B类。

 

三、问题定位

基于以上分析,我们参照代码和数据库脚本来查找问题原因。

首先,为什么某个cos值对应的过期用户数据特别多呢?难道是这类数据很特别,程序不会对其执行删除操作吗?

我们详细追踪了程序执行流程,发现在数据库脚本中,有一个参数值用于控制是否将过期用户数据删除以及过期多少天的数据要删除。而这个参数的值是在一个cos参数表中定义的。cos参数表的定义如下:

create table tb_cosparamter
(
  cosname   varchar(100)  not  null,
  cosid     int           not  null,
  cosvalue  int           not  null
)

控制过期用户数据删除的cos参数的名字“cosname”为“DelOverdueData”,“cosid”对应的是用户数据表中的服务等级,“cosvalue”表示删除数据的时间阈值。

我们在数据库中执行SQL语句“select cosid, cosvalue from tb_cosparamterwhere cosname = ‘DelOverdueData’”,结果如下:

cosid              cosvalue

1                     0

2                     30

3                     30

4                     40

5                     50

可以看到,服务等级为1的用户数据对应的时间阈值为0,表示不删除。而我们之前查看数据库,确实是cos值1对应的过期用户数据特别多。看来,就是因为这个cos值配得不对,导致了该服务等级对应的过期用户数据无法删除掉。

我们执行SQL语句“update tb_cosparamter set cosvalue= 30 where cosname = ‘DelOverdueData’ and cosid = 1”将cosid为1时对应的cosvalue值修改为30,重新启动清理模块之后,发现确有大量过期数据被删除掉了,但仍有少量用户属性为B的过期数据还存在,什么原因呢?

我们继续追踪数据库脚本,发现有一个参数值用于控制要删除哪类用户数据,这个参数也是在cos参数表tb_cosparamter中定义的。cos参数的名字“cosname”为“DelUserType”,“cosid”对应的是用户数据表中的服务等级,“cosvalue”为1表示只删除A类用户,为0表示A或B类用户都要删除。

我们在数据库中执行SQL语句“select cosid, cosvalue from tb_cosparamterwhere cosname = ‘DelUserType’”,结果如下:

cosid             cosvalue

1                    1

2                    1

3                    1

4                    1

5                    1

可以看到,各个服务等级对应的cos值均为1,表示只删除A类用户。这与我们观察到的情况是一致的。看来,就是因为这个cos值配得不对,导致了用户属性为B的过期数据无法删除掉。

我们执行SQL语句“update tb_cosparamter set cosvalue= 0 where cosname = ‘DelUserType’”将cosname为“DelUserType”对应的cosvalue值修改为0,重新启动清理模块之后,发现用户属性为B的过期数据被删除掉了,数据库中再也没有多余的过期数据了。

 

四、总结

在过期用户数据堆积问题的排查过程中,我们首先通过对问题数据进行分析来初步查找问题原因,之后通过追踪程序流程来定位问题。

通过本次问题排查,我们总结出的经验有以下几个:

第一,遇到程序问题,我们不要惊慌,可以先从表面上观察问题的现象并推测问题原因,然后再根据之前的分析深入研究程序流程,找到问题关键所在。

第二,对于数据库中的重要数据,要有人员定期进行维护,并作相应的记录。这样才能够避免出现某些参数值不一致的情况。

第三,修改数据库中的相关字段值时,一定要谨慎。在修改之前,尽量将重要表中的数据备份,避免对数据库造成破坏而无法恢复。

 

不管是程序bug也好,数据库问题也罢,我们的目标都是要尽力将它们解决掉。在解决问题的过程中,我们要采用灵活的处理方法,并沿着发现的蛛丝马迹追查下去。如此这般,不管是什么样的bug都是可以被消灭的。

 

 

 --------------------------

本人微信公众号:zhouzxi,请扫描以下二维码:

 

目录
相关文章
|
2月前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
9天前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
119 75
|
2月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
228 61
|
23天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
37 1
|
27天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
30天前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
56 5
|
2月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
233 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
3月前
|
人工智能 Cloud Native 容灾
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?