MySQL定時器常用案例
MySQL-定時器
介紹
在開發(fā)過程中經(jīng)常會遇到這樣一個問題:每天或者每月必須定時去執(zhí)行一條sql語句或更新或刪除或執(zhí)行特定的sql語句。而遇到這樣的問題我想很多人會說,我直接在程序代碼里寫一個定時器不就行了,對你說的沒問題,但是有些時候只是數(shù)據(jù)層面的問題,那么我們在程序里寫一個定時器就有點浪費了,
比如:
- 定時清理臟數(shù)據(jù)
- 在每月的月底統(tǒng)計這個月的業(yè)務(wù),將統(tǒng)計后的值放入統(tǒng)計表中
- 分段定時導(dǎo)出批量數(shù)據(jù),進行數(shù)據(jù)遷移
- 定時整理其他系統(tǒng)推送來的數(shù)據(jù),然后將整理后的數(shù)據(jù)放入本系統(tǒng)業(yè)務(wù)表中
- …自行研究
可以看出來,mysql定時器作用其實挺大的,只是很多人都把它忽略了而已,但是缺陷也很明顯就是只能處理mysql內(nèi)已有的數(shù)據(jù),這個就看你自己了具體怎么使用了.
注意: mysql定時器是從mysql5.1開始的,如果你的mysql版本低于5.1,那就不能使用mysql定時器
開啟定時器
在使用定時器前必須檢查一下,mysql的定時器是否開啟的, 默認是關(guān)閉的.
查詢定時器是否開啟OFF 關(guān)閉 , ON開啟
show VARIABLES like 'event_scheduler'
開啟mysql定時器
SET GLOBAL event_scheduler = 1;
然后我們在查詢下就是ON了,到這里我們mysql定時器開啟成功了
注意: 如果mysql服務(wù)器重啟這個還是會關(guān)閉的,
永久解決辦法:找到mysql根目錄下my.ini文件,打開并在[mysqld]標記下方添加一句event_scheduler = ON
即可。注意: 不要添加到[mysql]標記下,而是[mysqld]標記下,不然會配置無效。
重啟mysql 之后就會永久生效
使用sql語句創(chuàng)建定時器
為啥不使用Navicat創(chuàng)建定時器呢?, 反正我自我感覺的話,SQL比較踏實,使用Navicat創(chuàng)建定時器總是出現(xiàn)各種問題,我也不知道是不是軟件的問題,還是我自己的問題,反正用sql從來就沒有出現(xiàn)問題過.如果是簡單的定時器創(chuàng)建的話那么使用Navicat 創(chuàng)建也行,沒要求的…
先介紹下常用關(guān)鍵字的意思先別管怎么用的,后面參照案例代碼就懂了:
常用的語法關(guān)鍵字:
NOT PRESERVE 任務(wù)完成后清除定時器, (默認)
PRESERVE 任務(wù)完成后不清除定時器
EVERY 周期執(zhí)行
STARTS ENDS 在某個時間段執(zhí)行
AT 某個時間點執(zhí)行
ENDS 結(jié)束定時器時間
INTERVAL 間隔(時間)
常用的單位關(guān)鍵字:
HOUR : 小時
SECOND 秒
MINUTE : 分鐘
DAY : 天
MONTH: 月
定時器語法結(jié)構(gòu):
DROP EVENT IF EXISTS 定時器名稱 ; CREATE EVENT user_event ON SCHEDULE xx -- 定時器從什么開始執(zhí)行的 (必須) ENDS CURRENT_TIMESTAMP xx -- 定時器開始后在什么時候結(jié)束 (非必選) ON COMPLETION xx -- 定時器清除策略 (默認就行) DO sql語句 -- 定時器執(zhí)行的內(nèi)容,只允許一條sql語句以分號結(jié)束 (必須)
大致就是這樣,別糾結(jié),后面會舉幾個例子你參照參照就行了.
這里有一個地方需要注意:DO
后面能執(zhí)行的sql語句,只要mysql中有的都能執(zhí)行,但是每一個定時器只能執(zhí)行一個sql,如果多條sql的話,建議使用存儲過程,然后在使用定時器執(zhí)行存儲過程就行了
定時器常用案例
周期性
定時器,一直執(zhí)行
從現(xiàn)在開始每隔x天執(zhí)行一次
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event ON SCHEDULE EVERY 9 DAY STARTS NOW() DO call user_procedure();
每天凌晨1點執(zhí)行
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event on schedule EVERY 1 DAY STARTS date_add(date( ADDDATE(curdate(),1)),interval 1 hour) DO call user_procedure();
每個月的一號凌晨1 點執(zhí)行
DROP EVENT IF EXISTS 定時器名稱 ; CREATE EVENT user_event ON schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour) DO call user_procedure();
每個季度一號的凌晨1點執(zhí)行
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event ON schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour) DO call user_procedure();
每年1月1號凌晨1點執(zhí)行
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event ON schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour) DO call user_procedure();
周期一次性
定時器執(zhí)行很多次后在滿足某個條件,定時器結(jié)束
從現(xiàn)在開始每天執(zhí)行一次,5天后停止執(zhí)行
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event ON SCHEDULE EVERY 1 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY DO call user_procedure();
從現(xiàn)在開始5天后開始執(zhí)行,一個月后停止執(zhí)行
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH DO call user_procedure();
一次性
滿足指定條件時只會執(zhí)行一次定時器,然后定時器被清除
在未來指定時間點執(zhí)行一次
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event ON SCHEDULE AT TIMESTAMP '2021-09-24 18:26:00' ON COMPLETION NOT PRESERVE DO call user_procedure();
在2021-09-24 18:26:00
時候執(zhí)行user_procedure()
存儲過程一次之后,該定時器被系統(tǒng)清除
從現(xiàn)在開始1小時后執(zhí)行一次
DROP EVENT IF EXISTS user_event ; CREATE EVENT user_event ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR ON COMPLETION NOT PRESERVE DO call user_procedure();
開啟和關(guān)閉指定定時器
alter event user_event on completion preserve enable; -- 開啟定時任務(wù) alter event user_event on completion preserve disable; -- 關(guān)閉定時任務(wù)
查看當前用戶的定時任務(wù)
注意: 建議在創(chuàng)建定時器的時候使用,root用戶,這樣到時候統(tǒng)一管理也比較方便
能查看到定時器調(diào)用的sql
select * from information_schema.`EVENTS`;
能查看到定時器的狀態(tài)ENABLED(定時器使開啟狀態(tài))DISABLED (定時器使關(guān)閉狀態(tài))
select * from mysql.event;
到此這篇關(guān)于MySQL-定時器的文章就介紹到這了,更多相關(guān)mysql定時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql采用GROUP_CONCAT合并多條數(shù)據(jù)顯示的方法
這篇文章主要介紹了MySql采用GROUP_CONCAT合并多條數(shù)據(jù)顯示的方法,是MySQL數(shù)據(jù)庫程序設(shè)計中常見的實用技巧,需要的朋友可以參考下2014-10-10phpmyadmin中為站點設(shè)置mysql權(quán)限的圖文方法
在一個服務(wù)器上一般來講都不止一個站點,更不止一個MySQL(和PHP搭配之最佳組合)數(shù)據(jù)庫。2011-03-03mysql中的find_in_set字符串查找函數(shù)解析
這篇文章主要介紹了mysql中的find_in_set字符串查找函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08MySQL內(nèi)存使用率高且不釋放問題排查與總結(jié)
這篇文章主要給大家介紹了MySQL內(nèi)存使用率高且不釋放問題排查與總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細,對大家解決問題有一定的幫助,需要的朋友可以參考下2024-09-09