目次
とある日
実践ハイパフォーマンスMySQL 第3版読んでてEvent Schedulerなるものがあるらしいので試してみた。
EVENTとは
MySQL イベントは、スケジュールに従って実行されるタスクです。そのため、スケジュールされたイベントと呼ばれることがあり ます。イベントを作成すると、特定の日時に開始および終了する 1 つ以上の定期的な間隔で実行される 1 つ以上の SQL ステートメントを含む名前付きデータベース オブジェクトが作成されます。
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