今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、MySQLにEvent Scheduler なるものがあるらしいので使ってみたの日。

目次

とある日

実践ハイパフォーマンスMySQL 第3版読んでてEvent Schedulerなるものがあるらしいので試してみた。

EVENTとは

MySQL イベントは、スケジュールに従って実行されるタスクです。そのため、スケジュールされたイベントと呼ばれることがあり ます。イベントを作成すると、特定の日時に開始および終了する 1 つ以上の定期的な間隔で実行される 1 つ以上の SQL ステートメントを含む名前付きデータベース オブジェクトが作成されます。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 25.4.1 イベントスケジューラの概要

Linuxでいうところのcron みたいに指定した時間にSQLを実行できます。

使ってみる

MySQL 8.0.31で検証してます。

event_scheduler 設定確認

event_schedulerの値でイベントのスケジューリングが起動するのか確認できます。

(root@localhost) [test] 8.0.31 > select @@event_scheduler ;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON                |
+-------------------+
1 row in set (0.00 sec)

Event設定

テーブルのデータを1分ごとに今の時間に更新するイベントを作成します。

適当にテーブルを作成して1つだけ生成しておきます。

create table event_1(now timestamp );
insert into event_1 values(now());

イベント作成します。

MySQL :: MySQL 8.0 Reference Manual :: 13.1.13 CREATE EVENT Statement

CREATE EVENT myevent1
    ON SCHEDULE EVERY 1 MINUTE 
    DO
      UPDATE test.event_1 SET now = now();

EVERY 1 MINUTEで一分ごとにSQLが実行されます。

INFORMATION_SCHEMA.EVENTSでイベントが確認できます。

(root@localhost) [test] 8.0.31 >  SELECT * FROM INFORMATION_SCHEMA.EVENTS\G;
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: test
          EVENT_NAME: myevent1
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: UPDATE test.event_1 SET now = now()
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 1
      INTERVAL_FIELD: MINUTE
            SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
              STARTS: 2022-11-20 14:36:32
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2022-11-20 14:36:32
        LAST_ALTERED: 2022-11-20 14:36:32
       LAST_EXECUTED: 2022-11-20 15:37:32
       EVENT_COMMENT:
          ORIGINATOR: 1
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_0900_ai_ci
  DATABASE_COLLATION: utf8mb4_unicode_ci
1 row in set (0.00 sec)

動作確認

一分ごとに起動するのでただ待つだけです。

(root@localhost) [test] 8.0.31 > TABLE event_1;
+---------------------+
| now                 |
+---------------------+
| 2022-11-20 14:36:32 |
+---------------------+
1 row in set (0.00 sec)

一分後

(root@localhost) [test] 8.0.31 > TABLE event_1;
+---------------------+
| now                 |
+---------------------+
| 2022-11-20 14:37:32 |
+---------------------+
1 row in set (0.00 sec)

変わりました。

1秒ぐらいずれるのかなと思いましたがそんなことはないようですね。

後始末

一分ごとに起動するようにしているので、ほっておくとずっと動き続けるので削除します。

DROP EVENT myevent1;

削除します。

(root@localhost) [test] 8.0.31 > DROP EVENT myevent1;
Query OK, 0 rows affected (0.01 sec)

(root@localhost) [test] 8.0.31 >  SELECT * FROM INFORMATION_SCHEMA.EVENTS\G;
Empty set (0.00 sec)

ERROR:
No query specified

バッチ処理とか深夜時間帯にする場合に設定できそうです。

MySQLにもスケジュール機能あったの知らなかったです。

参考記事

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.11 CREATE EVENT 構文MySQLのイベントスケジューラを使う - Qiita

第121回 event_scheduler | gihyo.jp

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.11 CREATE EVENT 構文

MySQL :: MySQL 8.0 リファレンスマニュアル :: 25.4.2 イベントスケジューラの設定