1、背景
由于最近自己对数据库进行了排查,发现有些表的数据量比较大,随后将查询的结果与领导汇报,领导指示需要出一个数据库的定时清理方案,我是通过mysql的事件+储存过程来实现表数据的定时清理。如果文中有啥错误,或者有更好的方案,欢迎探讨以及纠正~
2、过程
最开始的方案是,用服务器的定时任务crontab,执行程序,做定时清理数据库。自我感觉还不错,和领导讨论,成功被pass了,泪崩~,领导的需求是希望直接通过数据库定时任务,清理过期的数据,于是开始了用事件+存储过程的形式执行定时清理表数据。
3、环境
mysql:5.7.23
windows第三方工具:Navicat
4、操作
创建存储过程
通过Navicat创建存储过程,如图一,图二:
储存过程是假设每次删除1万条数据,这里的思路是查询删除数据最新的创建时间,过期则删除,如果数据需要备份,就备份一份数据信息,这里清空过期数据,可以不需要精确到每一条数据,只要将大量的过期数据删除即可
BEGIN
DECLARE nowsDays timestamp DEFAULT (SELECT curdate()); -- 当前时间
DECLARE del_ctime timestamp DEFAULT Null; -- 删除数据的时间
-- 查询删除的最后一条记录
SELECT @wxid:=id,@ctime:=cTime FROM info WHERE id>0 LIMIT del_num,1;
SET del_ctime= @ctime;
-- 判断最后一条数据是否过期,过期则删除,如果数据还需则保存后删除
IF datediff(nowsDays, del_ctime)>del_days THEN
INSERT INTO infox SELECT * FROM info LIMIT del_num;
DELETE FROM info WHERE id<@wxid LIMIT del_num;
END IF;
END;
图一
图二
创建事件(定时任务)
上面已经将存储过程弄完,接下来,创建事件,调用存储过程,进行表删除。
检查mysql是否开启事件
MySQL [(demo)]> SHOW VARIABLES LIKE 'event_scheduler';
图三
如图三,如果Value为OFF,则需要开启事件
MySQL [(demo)]> SET GLOBAL event_scheduler = ON;
创建事件
通过Navicat创建事件,设置每天凌晨1点执行删除过期数据操作,如图四,图五:
图四
图五
查看事件是否创建成功,如图六:
SELECT * FROM information_schema.events;
图六
网友评论