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; -- 關閉定時任務