MySQL事件(定時任務)


what's the MySQL 事件

  MySQL5.1 版本開始引進 event 概念,MySQL 中的事件(event:時間觸發器)是用於執行定時或周期性的任務,類似 Linux 中的 crontab,事件可以精確到秒。通過單獨或調用存儲過程使用,在某一特定的時間點,觸發相關的 SQL 語句或存儲過程。事件由一個特定的線程來管理的,也就是所謂的事件調度器,但是事件不能直接調用。 

  總的來說,事件,就是定時任務的管理器。

查看事件調度器是否開啟

  事件由一個特定的線程來管理。啟用事件調度器后,擁有 SUPER 權限的賬戶執行 SHOW PROCESSLIST 就可以看到這個線程了。

SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;

 

開啟或關閉事件管理器

-- 開啟事件調度器
SET GLOBAL event_scheduler = ON;
 
-- 關閉事件調度器
SET GLOBAL event_scheduler = OFF;
 
-- 查看事件調度器狀態
SHOW VARIABLES LIKE 'event_scheduler';

注意:如果想要始終開啟事件,那么在使用SET GLOBAL開啟事件后,還需要在配置文件(Windows系統my.ini、Linux系統my.cnf)中添加 event_scheduler=on 並重啟數據庫服務。因為如果沒有添加,MySQL重啟事件后又會回到原來的狀態。

 

創建存儲過程

  MySQL 事件一般配合 MySQL 存儲過程使用,頂一萬 MySQL 存儲過程后由 MySQL 事件進行觸發調用。

存儲過程相關知識點鏈接:https://www.cnblogs.com/zhuminghui/p/12749283.html

 

事件的主要操作

  事件的主要操作有:創建、查詢、修改、刪除、開啟和關閉。

創建事件

語法結構

CREATE
    [DEFINER={user | CURRENT_USER}]
    EVENT [IF NOT EXISTS] event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO event_body;
DEFINER    -- 可選,用於定義事件執行時檢查權限的用戶
IF NOT EXISTS    -- 可選,用於判斷要創建的事件是否存在
EVENT event_name    -- 必選,用於指定事件名,event_name的最大長度為64個字符,如果為指定event_name,則默認為當前的MySQL用戶名(不區分大小寫)
ON SCHEDULE schedule    -- 必選,用於定義執行的時間和時間間隔
ON COMPLETION [NOT] PRESERVE    -- 可選,用於定義事件是否循環執行,即是一次執行還是永久執行,默認為一次執行,即 NOT PRESERVE
ENABLE | DISABLE | DISABLE ON SLAVE    -- 可選,用於指定事件的一種屬性。
                                       -- 其中,關鍵字ENABLE表示該事件是活動的,也就是調度器檢查事件是否必選調用;
                                       -- 關鍵字DISABLE表示該事件是關閉的,也就是事件的聲明存儲到目錄中,但是調度器不會檢查它是否應該調用;
                                       -- 關鍵字DISABLE ON SLAVE表示事件在從機中是關閉的。如果不指定這三個選擇中的任意一個,則在一個事件創建之后,它立即變為活動的。
COMMENT 'comment'    -- 可選,用於定義事件的注釋 
DO event_body    -- 必選,用於指定事件啟動時所要執行的代碼。可以是任何有效的SQL語句、存儲過程或者一個計划執行的事件。如果包含多條語句,可以使用BEGIN...END復合結構
參數說明

 

示例

create event second_event       -- 創建名為 second_event 的事件,注意此處沒有括號
on schedule every 1 second      -- 創建周期定時的規則,每秒鍾執行一次
on completion preserve disable  -- 創建后並不開始生效
do call test_proce();           -- do call test_proce() 是該事件的操作內容,表示調用名為 test_proce() 的存儲過程。

 

執行時間相關的例子

on schedule every 1 second         -- 每秒執行1次
on schedule every 2 minute         -- 每兩分鍾執行1次
on schedule every 3 day            -- 每3天執行1次
ON schedule every 1 day starts date_add(date_add_curdate(), interval 1 day), interval 1 hour)  -- 每天凌晨1點執行
ON schedule every 1 month starts date_add(date_add(date_sub(curdatte(),interval day(curdate())-1 day),interval 1 month),interval 1 hour) -- 每個月的第一天凌晨1點執行

on schedule at current_timestamp()+interval 5 day     -- 5天后執行
on schedule at current_timestamp()+interval 10 minute -- 10分鍾后執行
on schedule at '2016-10-01 21:50:00'                  -- 在2016年10月1日,晚上9點50執行
ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK -- 每 3 個月,從現在起一周后開始
ON SCHEDULE EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK -- 每十二個小時,從現在起三十分鍾后開始,並於現在起四個星期后結束

on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month -- 5天后開始每天都執行執行到下個月底
on schedule every 1 day ends current_timestamp()+interval 5 day -- 從現在起每天執行,執行5天

 

有關執行時間需要注意的點

  在 event 事件中:ON SCHEDULE 計划任務,有兩種設定計划任務的方式:

  (1)AT 時間戳,用來完成單次的計划任務。時間戳可以是任意的TIMESTAMP 和DATETIME 數據類型,時間戳需要大於當前時間

  (2)EVERY 時間(單位)的數量實踐單位[STARTS 時間戳] [ENDS時間戳],用來完成重復的計划任務。可以是任意非空(Not Null)的整數式,時間單位是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者 SECOND。

  提示: 其他的時間單位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建議使用這些不標准的時間單位。

[ON COMPLETION [NOT] PRESERVE]:ON COMPLETION參數表示"當這個事件不會再發生的時候",即當單次計划任務執行完畢后或當重復性的計划任務執行到了ENDS階段。而PRESERVE的作用是使事件在執行完畢后不會被Drop掉,建議使用該參數,以便於查看EVENT具體信息。

 

 

查看事件

SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS;

 

修改事件

語法結構

  ALTER EVENT 語句與 CREATE EVENT 語句基本相同。另外 ALTER EVENT 語句還有一個用法就是讓一個事件關閉或再次活動。

ALTER
    [DEFINER={user | CURRENT_USER}]
    EVENT [IF NOT EXISTS] event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO event_body;

 

刪除事件

DROP EVENT IF EXISTS 事件名;

 

開啟事件

alter event 事件名 on completion preserve enable; -- 開啟定時任務

 

關閉事件

alter event 事件名 on completion preserve disable; -- 關閉定時任務

 

 

 

 

 

 

                 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM