SQLで完結する定期実行タスクはOracleのDBMS_JOBSとか、MySQLのEvent Schedulerを使ってきました。
そういえば、managedなDBMSサービスでも使えるんだっけ?というのが気になったのでMySQL系の幾つかを確認してみました。
そもそもどんな使い方をしていたか
日次、週次、月次データの集計なんかに利用していました。
データベースのデータを集計して記録するだけなら、別のテクノロジーと組み合わせなくても十分です。
集計結果をメールしたい場合なども、集計とメールを送る機能をバラして仕舞えばシンプルにできるかなと。
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)
終わりに
確認してみるまでもなかったのかもしれない。