mysql事件+存储过程定时清理数据量大的表

2019-12-03  本文已影响0人  骆金

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; 
图六
上一篇 下一篇

猜你喜欢

热点阅读