2023年6月27日 星期二

MySql Event Schedule 筆記

 MySQL中的 事件(Events),是被用於定期執行某些資料庫任務:

使用前先查看事件排程有沒有被啟用(ON)
SELECT @@event_scheduler;

如果不是的話打這行就可以解決了
SET GLOBAL event_scheduler = ON;
如果需要關閉的話指令如下:
SET GLOBAL event_scheduler = OFF;
然後可以用這個指令查看目前正在執行的程序
SHOW PROCESSLIST;

EVENT事件的建立語法:
CREATE EVENT [IFNOT EXISTS] event_name
   ON SCHEDULE schedule(排程時間設定)
   [ON COMPLETION [NOT] PRESERVE]
   [ENABLE | DISABLE | DISABLE ON SLAVE]
   [COMMENT 'comment']
   DO sql_statement;

SQL語法說明
DEFINER可選項,給指定使用者使用許可權
IF NOT EXISTS可選項,用於判斷要建立的事件是否存在
EVENT event_name必選項,指定事件名稱,event_name的最大長度為64個字元,如果為指定event_name,則預設為當前的MySQL使用者名稱(不區分大小寫)
ON SCHEDULE schedule必選項,這裡的schedule用於定義執行的時間和時間間隔,在下面我們詳細講解
ON COMPLETION [NOT] PRESERVE
可選項,設定事件執行完一次後的處理方式;

當為on completion preserve 的時候,當event到期了,event會被disable,但是該event還是會存在

當為on completion not preserve的時候,當event到期的時候,該event會被自動刪除掉.
ENABLE、DISABLE、DISABLE ON SLAVE
可選項,用於指定事件的一種屬性。

ENABLE表示該事件是開啟的,也就是排程器檢查事件是否必選呼叫;

DISABLE表示該事件是關閉的,也就是事件的宣告儲存到目錄中,但是排程器不會檢查它是否應該呼叫;

DISABLE ON SLAVE表示事件在從機中是關閉的。如果不指定這三個選擇中的任意一個,則在一個事件建立之後,它立即變為活動的。
COMMENT ‘comment'可選項,用於定義事件的註釋
DO event_body必選項,用於指定事件啟動時所要執行的程式碼。可以是任何有效的SQL語句、儲存過程或者一個計劃執行的事件。如果包含多條語句,可以使用BEGIN…END複合結構

schedule 排程時間設定語法:排程時間設定包括ATEVERY兩種
單次定時的事件Event使用AT,迴圈定時的事件Event用EVERY

建立在某個時間點執行的Event(單次定時)

AT TIMESTAMP 時間字串 [+ INTERVAL INTERVAL]
CREATE EVENT changeActive
   ON SCHEDULE AT TIMESTAMP '2023-06-13 18:00:00'
    COMMENT 'change new foreign fee to active.'
    DO UPDATE `ear`.`priceitems` SET `active` = '1' WHERE (`id` = '127');   
如果有多個同時要處理的事情。可以像寫store procedure一樣的寫法如
USE ear;
DELIMITER $$
CREATE EVENT changeActive
    ON SCHEDULE AT TIMESTAMP '2023-06-30 15:59:59'
    COMMENT 'change new foreign fee to active.'
    DO
      BEGIN
        UPDATE `ear`.`priceitems` SET `active` = '1' WHERE (`id` = '127');
UPDATE `ear`.`priceitems` SET `active` = '0' WHERE (`id` = '126');
      END $$
DELIMITER ;

建立迴圈定時執行的事件Event

EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]

例:從2023-06-01 00:00:00開始每天零點定時清除jobs資料表的資料
CREATE EVENT demo_event5
ON SCHEDULE EVERY 1 DAY STARTS '2023-06-01 00:00:00'
ON COMPLETION PRESERVE
DO TRUNCATE table `jobs`


查詢建立的Event:

SELECT * FROM information_schema.EVENTS;

修改Events:

ALTER
[DEFINER = user]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
[DO event_body]

例:
ALTER EVENT demo_event2
ON SCHEDULE AT TIMESTAMP '2023-06-13 16:25:00'
Do 
UPDATE `ear`.`priceitems` SET `active` = '1' WHERE (`id` = '127');

關閉事件任務: ALTER EVENT 事件名稱 ON COMPLETION PRESERVE DISABLE;
開啟事件任務:ALTER EVENT 事件名稱 ON COMPLETION PRESERVE ENABLE;


刪除Event:(要有權限)
DROP EVENT [IF EXISTS] event_name
例:
DROP EVENT demo_event2;


參考網址:
1.https://www.it145.com/9/80939.html (MySQL定時任務(EVENT事件)如何設定詳解)
2.https://dev.mysql.com/doc/refman/5.7/en/create-event.html
3.https://stackoverflow.com/questions/61902117/update-2-table-each-table-in-diferent-database-using-event-schedule