mysql事件+存儲過程定時清理數(shù)據(jù)量大的表

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; 
圖六
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容