MySQL Event Schedulerはmanagedなサービスでも使えるのか?

2022/10/22 17:13

※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】

SQLで完結する定期実行タスクはOracleのDBMS_JOBSとか、MySQLのEvent Schedulerを使ってきました。

そういえば、managedなDBMSサービスでも使えるんだっけ?というのが気になったのでMySQL系の幾つかを確認してみました。

TL;DR

そもそもどんな使い方をしていたか

日次、週次、月次データの集計なんかに利用していました。

データベースのデータを集計して記録するだけなら、別のテクノロジーと組み合わせなくても十分です。

集計結果をメールしたい場合なども、集計とメールを送る機能をバラして仕舞えばシンプルにできるかなと。

AWS RDS(MySQL)

MySQL8.0.28で確認

  mysql> SHOW VARIABLES like 'event_scheduler';
  +-----------------+-------+
  | Variable_name   | Value |
  +-----------------+-------+
  | event_scheduler | ON    |
  +-----------------+-------+
  1 row in set (0.02 sec)

デフォルトでONっぽい

  mysql> SHOW PROCESSLIST;
  +----+-----------------+---------------------+-------+---------+------+------------------------+------------------+
  | Id | User            | Host                | db    | Command | Time | State                  | Info             |
  +----+-----------------+---------------------+-------+---------+------+------------------------+------------------+
  |  5 | event_scheduler | localhost           | NULL  | Daemon  | 1899 | Waiting on empty queue | NULL             |
  | 13 | rdsadmin        | localhost:28894     | mysql | Sleep   |    9 |                        | NULL             |
  | 23 | admin           | ***.***.**.**:57506 | mydb  | Query   |    0 | init                   | SHOW PROCESSLIST |
  +----+-----------------+---------------------+-------+---------+------+------------------------+------------------+
  3 rows in set (0.01 sec)

event_schedulerも動いているし、悩みどころはなさそう。

AWS Aurora(MySQL)

3.02.1(compatible with MySQL 8.0.23) で確認

Auroraも特に問題なさそうでした

  mysql> SHOW VARIABLES like 'event_scheduler';
  +-----------------+-------+
  | Variable_name   | Value |
  +-----------------+-------+
  | event_scheduler | ON    |
  +-----------------+-------+
  1 row in set (0.18 sec)

  mysql> SHOW PROCESSLIST;
  +----+-----------------+----------------------+-------+---------+------+------------------------+------------------+
  | Id | User            | Host                 | db    | Command | Time | State                  | Info             |
  +----+-----------------+----------------------+-------+---------+------+------------------------+------------------+
  |  5 | event_scheduler | localhost            | NULL  | Daemon  |  606 | Waiting on empty queue | NULL             |
  | 17 | rdsadmin        | localhost            | NULL  | Sleep   |    1 |                        | NULL             |
  | 18 | rdsadmin        | localhost            | NULL  | Sleep   |    2 |                        | NULL             |
  | 21 | rdsadmin        | localhost            | NULL  | Sleep   |   66 |                        | NULL             |
  | 22 | rdsadmin        | localhost            | NULL  | Sleep   |    1 |                        | NULL             |
  | 24 | admin           | ***.***.**.**:58941  | mydb1 | Query   |    0 | init                   | SHOW PROCESSLIST |
  +----+-----------------+----------------------+-------+---------+------+------------------------+------------------+
  6 rows in set (0.18 sec)

AWS Aurora Serverless v1

MySQL 5.7 2.08.3 で確認

ウェブサービスデータ APIをオンにして、AWS Consoleのクエリエディタから実行した。

  > SHOW VARIABLES like 'event_scheduler';
  event_scheduler     OFF

  > SHOW PROCESSLIST;
  Id  User    Host    db      Command Time    State   Info
  18  rdsadmin        localhost       NULL    Sleep   1       cleaning up     NULL
  20  rdsadmin        localhost       NULL    Sleep   1       cleaning up     NULL
  22  rdsadmin        localhost       NULL    Sleep   1       cleaning up     NULL
  23  rdsadmin        localhost       NULL    Sleep   90      cleaning up     NULL
  25  admin   **.*.**.**:46303        mydb1   Query   0       starting        SHOW PROCESSLIST

event_schedulerはOFFだった。PROCESSLISTにevent_schedulerのプロセスもいない。

設定変更を試みるが、SQLでの変更はできない。

スーパーユーザーで実行しているが権限がない。

  > SET GLOBAL event_scheduler = ON;

  Access denied; you need (at least one of) the SUPER privilege(s) for this operation; Error code: 1227; SQLState: 42000

Aurora Serverless v1のパラメーター変更はパラメーターグループを作成 して行わなければいけない。

カスタムのパラメーターグループを作成して、event_schedulerの設定を明示的にONにしたが、結局設定はONに出来ず。

  > SHOW VARIABLES like 'event_scheduler';
  event_scheduler     OFF

Aurora Serverless v1 はアイドル状態が続くとECUが0になり停止する設定ができるため、Event Schedulerは使えないようになっているのでしょうか。

AWS Aurora Serverless v2

MySQL 3.02.1(compatible with MySQL 8.0.23) で確認

Aurora Serverless v2は、v1のように停止することはなく、ミニマムはECUが0.5までしか下がらない。

通常通りプロセスもいるし問題なく使えそう。

  mysql> SHOW VARIABLES like 'event_scheduler';
  +-----------------+-------+
  | Variable_name   | Value |
  +-----------------+-------+
  | event_scheduler | ON    |
  +-----------------+-------+
  1 row in set (0.18 sec)

  mysql> SHOW PROCESSLIST;
  +----+-----------------+----------------------+------+---------+------+------------------------+------------------+
  | Id | User            | Host                 | db   | Command | Time | State                  | Info             |
  +----+-----------------+----------------------+------+---------+------+------------------------+------------------+
  |  5 | event_scheduler | localhost            | NULL | Daemon  |  164 | Waiting on empty queue | NULL             |
  | 16 | rdsadmin        | localhost            | NULL | Sleep   |    0 |                        | NULL             |
  | 17 | rdsadmin        | localhost            | NULL | Sleep   |    1 |                        | NULL             |
  | 18 | rdsadmin        | localhost            | NULL | Sleep   |   10 |                        | NULL             |
  | 19 | admin           | ***.***.***.**:59485 | NULL | Query   |    0 | init                   | SHOW PROCESSLIST |
  +----+-----------------+----------------------+------+---------+------+------------------------+------------------+
  5 rows in set (0.17 sec)

Google Cloud CloudSQL(MySQL)

バージョン: 8.0, 5.7, 5.6 で確認

特段変わりはなく使えそう。

  mysql> SHOW VARIABLES like 'event_scheduler';
  +-----------------+-------+
  | Variable_name   | Value |
  +-----------------+-------+
  | event_scheduler | ON    |
  +-----------------+-------+
  1 row in set (0.02 sec)

  mysql> SHOW PROCESSLIST;
  +----+-----------------+----------------------+------+---------+------+------------------------+------------------+
  | Id | User            | Host                 | db   | Command | Time | State                  | Info             |
  +----+-----------------+----------------------+------+---------+------+------------------------+------------------+
  |  5 | event_scheduler | localhost            | NULL | Daemon  |   82 | Waiting on empty queue | NULL             |
  |  8 | root            | 127.0.0.1:44688      | NULL | Sleep   |    0 |                        | NULL             |
  | 11 | root            | 127.0.0.1:58720      | NULL | Sleep   |   13 |                        | NULL             |
  | 12 | root            | 127.0.0.1:58732      | NULL | Sleep   |   13 |                        | NULL             |
  | 13 | root            | 127.0.0.1:58740      | NULL | Sleep   |   13 |                        | NULL             |
  | 24 | root            | ***.***.***.**:57888 | NULL | Query   |    0 | init                   | SHOW PROCESSLIST |
  +----+-----------------+----------------------+------+---------+------+------------------------+------------------+
  6 rows in set (0.02 sec)

終わりに

確認してみるまでもなかったのかもしれない。

Prev Entry

Next Entry