サーチ…


イベントを作成する

Mysqlには、予定されているものの多くがSQLに関連し、ファイルに関連することが少ないときに、複雑なcronのやりとりを避けるためのEVENT機能があります。マニュアルページを参照してくださいここに 。イベントを定期的な間隔で実行するようにスケジュールされたストアドプロシージャと考えてください。

イベント関連の問題のデバッグに時間を節約するには、イベントを処理するためにグローバル・イベント・ハンドラをオンにする必要があることに注意してください。

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回実行

彼らが実際にやっていることを無視する(互いに対して遊ぶ)。ポイントは区間とスケジュールです。

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のマニュアルページを参照してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow