1、背景
由于最近自己對數(shù)據(jù)庫進行了排查,發(fā)現(xiàn)有些表的數(shù)據(jù)量比較大,隨后將查詢的結(jié)果與領(lǐng)導(dǎo)匯報,領(lǐng)導(dǎo)指示需要出一個數(shù)據(jù)庫的定時清理方案,我是通過mysql的事件+儲存過程來實現(xiàn)表數(shù)據(jù)的定時清理。如果文中有啥錯誤,或者有更好的方案,歡迎探討以及糾正~
2、過程
最開始的方案是,用服務(wù)器的定時任務(wù)crontab,執(zhí)行程序,做定時清理數(shù)據(jù)庫。自我感覺還不錯,和領(lǐng)導(dǎo)討論,成功被pass了,淚崩~,領(lǐng)導(dǎo)的需求是希望直接通過數(shù)據(jù)庫定時任務(wù),清理過期的數(shù)據(jù),于是開始了用事件+存儲過程的形式執(zhí)行定時清理表數(shù)據(jù)。
3、環(huán)境
mysql:5.7.23
windows第三方工具:Navicat
4、操作
創(chuàng)建存儲過程
通過Navicat創(chuàng)建存儲過程,如圖一,圖二:
儲存過程是假設(shè)每次刪除1萬條數(shù)據(jù),這里的思路是查詢刪除數(shù)據(jù)最新的創(chuàng)建時間,過期則刪除,如果數(shù)據(jù)需要備份,就備份一份數(shù)據(jù)信息,這里清空過期數(shù)據(jù),可以不需要精確到每一條數(shù)據(jù),只要將大量的過期數(shù)據(jù)刪除即可
BEGIN
DECLARE nowsDays timestamp DEFAULT (SELECT curdate()); -- 當(dāng)前時間
DECLARE del_ctime timestamp DEFAULT Null; -- 刪除數(shù)據(jù)的時間
-- 查詢刪除的最后一條記錄
SELECT @wxid:=id,@ctime:=cTime FROM info WHERE id>0 LIMIT del_num,1;
SET del_ctime= @ctime;
-- 判斷最后一條數(shù)據(jù)是否過期,過期則刪除,如果數(shù)據(jù)還需則保存后刪除
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;


創(chuàng)建事件(定時任務(wù))
上面已經(jīng)將存儲過程弄完,接下來,創(chuàng)建事件,調(diào)用存儲過程,進行表刪除。
檢查mysql是否開啟事件
MySQL [(demo)]> SHOW VARIABLES LIKE 'event_scheduler';

如圖三,如果Value為OFF,則需要開啟事件
MySQL [(demo)]> SET GLOBAL event_scheduler = ON;
創(chuàng)建事件
通過Navicat創(chuàng)建事件,設(shè)置每天凌晨1點執(zhí)行刪除過期數(shù)據(jù)操作,如圖四,圖五:


查看事件是否創(chuàng)建成功,如圖六:
SELECT * FROM information_schema.events;
