一、需求背景
由于系统中存在许多临时表,这些临时表主要用于解析附件或者Excel或者合并资源池数据等等业务功能。
随着时间的积累,数据量越来越大,其中最大的一个表数据量达到了22亿,因此需要对这些临时表进行定时清理,节省数据库存储空间和提升查询效率。
二、技术方案
需要保留最近15天的数据且数据量太大,不能直接delete,所以采用定时任务每天凌晨3点分批进行删除策略。由于数据库主键id采用自增方式,所以这里采用代码分批计算最大最小主键id方式进行删除,另外每次循环删除的最大行数、执行间隔通过配置数据字典方式更加方便灵活控制。
1、历史数据处理
(1)新建相同表结构的数据表,新表补充creation_date的索引,利用同步工具同步最新15天的数据到新表。
(2)校验新表和旧表的数据一致性(统计总行数、查询最大id和最小id等)
(3)将新表替换为旧表(可以通过重命名方式)
(4)完成历史数据的清理(需要数据库服务器停机操作)
2、大表定时清理
大表数据可能一天达到几千万条,需要按照时间分段再分批处理。
此步骤前提是完成历史数据处理之后且建立creation_date的索引。
结束时间endDate:当前时间-15天
开始时间startDate:endDate-intervalHours(间隔时间)
最小主键minId:
select id as minId from relation_temp_t where creation_date >= #{startDate} order by creation_date asc limit 1;
最大主键maxId:
select id as maxId from relation_temp_t where creation_date <= #{endDate} order by creation_date desc limit 1;
每次删除的最大数量按照10000条进行限制。
分批执行的最大时间不超过默认配置时间2h,若在2h内还没有执行完成,则终止删除,等下次调度时间再重新发起执行删除操作。
删除脚本为:
delete from relation_temp_t where id between #{minId} and #{maxId} and creation_date between #{startDate} and #{endDate};
三、代码实现
public int newChildJobTask(){
PeriodDataCleanVo cleanVo = getPeriodDataCleanVo

最低0.47元/天 解锁文章
6886

被折叠的 条评论
为什么被折叠?



