建立一個事件

當你排程的大部分內容與 SQL 相關且檔案相關性較低時,Mysql 具有 EVENT 功能,可以避免複雜的 cron 互動。請參見此處的手冊頁。將事件視為計劃以重複間隔執行的儲存過程。

為了節省除錯與事件相關的問題的時間,請記住必須開啟全域性事件處理程式來處理事件。

SHOW VARIABLES WHERE variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

關閉它,什麼都不會觸發。所以開啟它:

SET GLOBAL event_scheduler = ON;

用於測試的模式

create table theMessages
(   id INT AUTO_INCREMENT PRIMARY KEY,
    userId INT NOT NULL,
    message VARCHAR(255) NOT NULL,
    updateDt DATETIME NOT NULL,
    KEY(updateDt)
);
 
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 123','2015-08-24 11:10:09');
INSERT theMessages(userId,message,updateDt) VALUES (7,'message 124','2015-08-29');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 125','2015-09-03 12:00:00');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 126','2015-09-03 14:00:00');

提供上述插入物以顯示起點。請注意,下面建立的 2 個事件將清除行。

建立 2 個活動,每天第 1 次,每 10 分鐘第 2 次

忽略他們實際在做什麼(互相對戰)。重點在於 INTERVAL 和日程安排。

DROP EVENT IF EXISTS `delete7DayOldMessages`;
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
  ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages 
   WHERE datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
   
  -- Other code here

END$$
DELIMITER ;

DROP EVENT IF EXISTS `Every_10_Minutes_Cleanup`;
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
  ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages 
   WHERE TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)

   -- Other code here
END$$
DELIMITER ;

顯示事件狀態(不同方法)

SHOW EVENTS FROM my_db_name; -- List all events by schema name (db name)
SHOW EVENTS; 
SHOW EVENTS\G; -- <--------- I like this one from mysql> prompt

*************************** 1. row ***************************
                  Db: my_db_name
                Name: delete7DayOldMessages
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: DAY
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
                  Db: my_db_name
                Name: Every_10_Minutes_Cleanup
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: MINUTE
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.06 sec)

隨機的東西要考慮

DROP EVENT someEventName; - 刪除事件及其程式碼

ON COMPLETION PRESERVE - 當事件處理完畢後,保留它。否則,它將被刪除。

事件就像觸發器。它們不是由使用者程式呼叫的。相反,它們是預定的。因此,他們無聲地成功或失敗。

手冊頁的連結顯示了間隔選擇的相當多的靈活性,如下所示:

間隔:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

事件是處理系統重複和計劃任務的強大機制。它們可能包含儘可能多的語句,DDL 和 DML 例程,以及你可能合理希望的複雜連線。請參閱名為 儲存程式限制 的 MySQL 手冊頁。