MySQL 5.1 引入的時(shí)間調(diào)度器可以作為定時(shí)任務(wù)調(diào)度器,取代系統(tǒng)的cron調(diào)度,調(diào)度時(shí)間可以精確到秒,實(shí)時(shí)性好。
開啟事件調(diào)度器
首先查看是否開啟了事件調(diào)度器: show variables like "event_scheduler";
或 SELECT @@event_scheduler;
。
開啟事件調(diào)度器: SET GLOBAL event_scheduler = ON;
,這個(gè)命令需要具有 SUPER 權(quán)限才能執(zhí)行,可以用 root 用戶來執(zhí)行,說明是作用在整個(gè)數(shù)據(jù)庫服務(wù)上的,而不單是某個(gè)數(shù)據(jù)庫實(shí)例。
查看事件的執(zhí)行情況
SELECT * FROM information_schema.EVENTS;
創(chuàng)建事件
語法:
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
-- 執(zhí)行完后是否保留事件,默認(rèn)為NOT PRESERVE,也就是非周期性任務(wù)執(zhí)行完后刪除。
[ENABLE | DISABLE] -- 開啟或關(guān)閉事件
[COMMENT 'comment'] -- 事件說明
DO sql_statement; -- 要執(zhí)行的 sql 語句
schedule:
AT TIMESTAMP [+INTERVAL INTERVAL_VAL]
-- AT 用于在指定時(shí)間點(diǎn)執(zhí)行一次。
EVERY INTERVAL [STARTS TIMESTAMP] [END TIMESTAMP]
-- EVERY 用于每隔指定的時(shí)間重復(fù)執(zhí)行。
-- 如果沒有指定開始時(shí)間和結(jié)束時(shí)間,那么默認(rèn)的開始時(shí)間就是當(dāng)前結(jié)束時(shí)間,沒有結(jié)束時(shí)間。
INTERVAL_VAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
-- quantity 是數(shù)值,花括號里的是的時(shí)間單位。
修改事件
ALTER EVENT event_name
[ON SCHEDULE schedule] -- 設(shè)定調(diào)度時(shí)間
[RENAME TO new_event_name] -- 重命名為另一個(gè)名字
[ON COMPLETION [NOT] PRESERVE] -- 執(zhí)行完后是否保留事件,默認(rèn)不保留
[COMMENT 'comment'] -- 事件說明
[ENABLE | DISABLE] -- 開啟或關(guān)閉事件
[DO sql_statement] -- 要執(zhí)行的 sql 語句
刪除事件
DROP EVENT eventName;
DROP EVENT IF EXISTS eventName;
代碼示例
-- 創(chuàng)建一個(gè)測試表
CREATE TABLE aaa (timeline TIMESTAMP)
-- 每隔一秒鐘插入一條記錄,這里沒有指定時(shí)間范圍,就從當(dāng)前時(shí)間開始一直重復(fù)調(diào)度。
CREATE EVENT e_test
ON SCHEDULE EVERY 1 SECOND
DO INSERT INTO aaa VALUES(CURRENT_TIMESTAMP);
-- 創(chuàng)建事件但不調(diào)度執(zhí)行
CREATE EVENT e_test
ON SCHEDULE EVERY 1 SECOND
DISABLE
COMMENT 'not enabled, just for later use .'
DO INSERT INTO aaa VALUES(CURRENT_TIMESTAMP);
-- 修改事件的調(diào)度間隔,并使能被調(diào)度。
ALTER EVENT e_test
ON SCHEDULE EVERY 10 SECOND
ENABLE;
-- 在指定時(shí)間點(diǎn)執(zhí)行一次
CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2014-01-27 23:59:50'
DO TRUNCATE TABLE aaa;
-- 在指定時(shí)間點(diǎn)執(zhí)行一次,執(zhí)行完后保留事件。
CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2014-01-27 23:59:50'
ON COMPLETION PRESERVE
DO TRUNCATE TABLE aaa;
-- 從某個(gè)時(shí)間范圍內(nèi)周期性地執(zhí)行任務(wù)
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP '2014-01-27 23:59:50'
ENDS TIMESTAMP '2014-02-27 23:59:50'
DO TRUNCATE TABLE aaa;
-- 刪除事件
DROP EVENT e_test;
-- 如果存在,刪除事件。
DROP EVENT IF EXISTS e_test;
|