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

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

【文章摘要

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

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

 

一、问题描述

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

为了维护不同用户的信息,在数据库中建立了用户数据表,表中包含了用户号码(如手机号)、状态(如正常使用、停用、欠费等)、服务等级(称作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,请扫描以下二维码:

 

目录
相关文章
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
1532 4
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
12月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
12月前
|
人工智能 Java 关系型数据库
使用数据连接池进行数据库操作
使用数据连接池进行数据库操作
273 11
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
882 174
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
1124 0
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。

热门文章

最新文章