发布于 

定时删除Mysql表过期数据的小工具

最近接到一个需求,业务数据表中有三张表,只想保留最近365天的数据,过期的就删除,避免这些没有太大意义的数据造成数据表越来越大。考虑到不想在业务代码中实现此逻辑,避免后续投产变更麻烦,因此单独实现一个小工具,通过配置文件
实现定时删除指定日期数据功能。

背景

最近接到一个需求,业务数据表中有三张表,只想保留最近365天的数据,过期的就删除,避免这些没有太大意义的数据造成数据表越来越大。

当时想了两种解决方案:

方案一

利用mysqlevent事件机制,通过写sql脚本,可以很快的完成这个需求,优点很明显:

  1. 快速实现,时间成本低
  2. 不需要再引入什么乱七八糟的东西或者代码

但是,也有很明显的缺点:

  1. 没有日志啊,怎么知道有没有跑,成没成功呢
  2. 只能定时跑,不能人工触发,也没法做管理

方案二

当时出现在脑海里的第二个思路就是直接利用现有代码里面的ScheduledTask,写点java代码就把这个需求给搞了,这样的话日志也有了,加个controller连手动触发也有了,再积极点,搞个异常告警什么的也不是事。

然而,这样真的好吗?这次是要清三个表,就写三个定时任务,三段sql,下次再加个表,再加代码上线?好累啊,有没有更好点的方式呢?

方案三

所以就干脆自己写个工具算了,期望是以后有类似的需求就别再开发了。
总的来说,设计思路是这样的:

  1. 使用SpringBoot快速开发一个Web应用
  2. 启动的时候读配置文件,使用quartz加载定时任务
  3. 配置文件里面配置了清理的时间(cron表达式)、数据库url用户名密码要清理的库名表名清理依赖的字段保存时间
  4. 定时任务执行的时候,根据配置文件的配置,创建链接,拼装清理的sql语句,然后执行,执行完关闭链接

通过上面的设计,一是能够满足这次的需求,二是以后有类似的数据清理需求的时候,可以不用再做代码开发了,改改配置就好了,三是以后可以方便的做拓展,比如,加入zookeeper,就可以做分布式任务协调,加个页面,就可以页面操作和管理所有的清理任务,想简单点的话,有类似需求的项目可以自己一行命令运行这个工具类,想得复杂一点,可以加入不同的清理对象,使得不仅仅支持Mysql,然后可以搭建一个平台类项目,不同项目的数据清理需求都可以在这里维护管理….

当然,我想多了,其实就是完成这么一个简单的需求而已。

那么有没有其他方案呢?我想也有的,引入个分布式调度框架,然后写个清理脚本,用人家成熟的产品来做这个活儿嘛,但是想想好像更重了。

附上github地址:https://github.com/DevotedTangLiu/data-clean-util