MySQL道普請便り
第121回 event_scheduler
innotopやSHOW PROCESSLISTを使ってMySQLで実行中のクエリを確認すると,
今回はevent_
event_ schedulerの設定
システム変数event_SET GLOBAL event_
で設定し,SHOW VARIABLES like 'event_
で設定を確認することができます。
mysql> SET GLOBAL event_scheduler = 'ON'; Query OK, 0 rows affected (0.01 sec) mysql> SHOW VARIABLES like 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | ON | +-----------------+-------+ 1 row in set (0.00 sec)
実際に'ON'にしてSHOW PROCESSLIST
を実行するとevent_--event-scheduler=DISABLED
をつけて実行するか,event_
を記述しておくことで設定でき,
mysql> SHOW VARIABLES like 'event_scheduler'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | event_scheduler | DISABLED | +-----------------+----------+ 1 row in set (0.39 sec) mysql> SET GLOBAL event_scheduler = 'OFF'; ERROR 1290 (HY000): The MySQL server is running with the --event-scheduler=DISABLED or --skip-grant-tables option so it cannot execute this statement mysql> SET GLOBAL event_scheduler = 'ON'; ERROR 1290 (HY000): The MySQL server is running with the --event-scheduler=DISABLED or --skip-grant-tables option so it cannot execute this statement
なお,
eventの作成
eventを作成するにはCREATE EVENT構文を用います。CREATE EVENT構文はCREATE EVENT <event名> ON SCHEDULE <実行間隔> DO <実行するSQL statement>
の形式で記述します。作成したeventは作成したDBのスキーマに紐づき,
ためしにd1データベースで30秒間sleepを実行するeventを実行してみましょう。
mysql> use d1 Database changed mysql> CREATE EVENT sleep30 -> ON SCHEDULE -> EVERY 1 MINUTE -> COMMENT 'sleep 30' -> DO -> SELECT sleep(30) FROM dual; Query OK, 0 rows affected (0.03 sec)
作成したEVENTはSHOW EVENTS
で確認することができます。
mysql> SHOW EVENTS\G *************************** 1. row *************************** Db: d1 Name: sleep30 Definer: root@localhost Time zone: SYSTEM Type: RECURRING Execute at: NULL Interval value: 1 Interval field: MINUTE Starts: 2020-04-29 16:31:24 Ends: NULL Status: SLAVESIDE_DISABLED Originator: 39355 character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_bin 1 row in set (0.00 sec)
実際にSHOW PROCESSLISTで確認すると,SELECT sleep(30) FROM dual;
が1分に一度実行されることが確認できます。
mysql> SHOW PROCESSLIST; +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ | 4 | event_scheduler | localhost | NULL | Daemon | 0 | Waiting for next activation | NULL | | 9 | repl | 127.0.0.1:54622 | NULL | Binlog Dump GTID | 1509 | Master has sent all binlog to slave; waiting for more updates | NULL | | 10 | repl | 127.0.0.1:54620 | NULL | Binlog Dump GTID | 1509 | Master has sent all binlog to slave; waiting for more updates | NULL | | 27 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST | | 28 | root | localhost | d1 | Connect | 0 | User sleep | SELECT sleep(30) FROM dual | +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ 5 rows in set (0.01 sec)
続いて60秒間sleepするeventを作成し,
mysql> CREATE EVENT sleep60 -> ON SCHEDULE -> EVERY 1 MINUTE -> COMMENT 'sleep 60' -> DO -> SELECT sleep(60) FROM dual; Query OK, 0 rows affected (0.02 sec) mysql> SHOW PROCESSLIST; +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ | 4 | event_scheduler | localhost | NULL | Daemon | 4 | Waiting for next activation | NULL | | 9 | repl | 127.0.0.1:54622 | NULL | Binlog Dump GTID | 1753 | Master has sent all binlog to slave; waiting for more updates | NULL | | 10 | repl | 127.0.0.1:54620 | NULL | Binlog Dump GTID | 1753 | Master has sent all binlog to slave; waiting for more updates | NULL | | 27 | root | localhost | d1 | Query | 0 | starting | SHOW PROCESSLIST | | 34 | root | localhost | d1 | Connect | 18 | User sleep | SELECT sleep(60) FROM dual | | 35 | root | localhost | d1 | Connect | 4 | User sleep | SELECT sleep(30) FROM dual | +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ 6 rows in set (0.00 sec)
同時に2つ実行されていることが確認できました。
eventの詳細な作成方法や利用方法については,
event_ schedulerを設定する際の注意点
インターバル内で完了していないeventは多重で実行される
実行中のeventがインターバルの間隔内で終了しなかった場合には,SHOW PROCESSLIST
を実行してみます。
mysql> SHOW PROCESSLIST; +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ | 4 | event_scheduler | localhost | NULL | Daemon | 12 | Waiting for next activation | NULL | | 9 | repl | 127.0.0.1:54622 | NULL | Binlog Dump GTID | 2587 | Master has sent all binlog to slave; waiting for more updates | NULL | | 10 | repl | 127.0.0.1:54620 | NULL | Binlog Dump GTID | 2587 | Master has sent all binlog to slave; waiting for more updates | NULL | | 27 | root | localhost | d1 | Query | 0 | starting | SHOW PROCESSLIST | | 55 | root | localhost | d1 | Connect | 72 | User sleep | SELECT sleep(90) FROM dual | | 56 | root | localhost | d1 | Connect | 12 | User sleep | SELECT sleep(90) FROM dual | +----+-----------------+-----------------+------+------------------+------+---------------------------------------------------------------+----------------------------+ 6 rows in set (0.05 sec)
sleep(90)のクエリが2つ実行されています。このeventはsleepするだけなので二重で実行されることによる影響はありませんが,
レプリケーション環境でのeventの作成
レプリケーション環境下でeventを作成すると,
ただし,
また,
詳細な動作については17.
mysqldumpでMySQLを復元させる場合
mysqldumpで論理バックアップを取得する場合,--events
をつけて実行するか,
まとめ
今回はMySQLにあるevent_
バックナンバー
MySQL道普請便り
- 第138回 オンラインスキーママイグレーションツール gh-ostを使ってみよう[その1]
- 第137回 MySQLTunerを使ってチューニングの足がかりを見つけてみる
- 第136回 CHECK制約を利用してみよう
- 第135回 MySQL 8.0で追加されたoptimizer_switchのフラグについて
- 第134回 DDLと暗黙的なコミットについて
- 第133回 Partial Revokesによる権限の一部剥奪について
- 第132回 Internal Temporary Table(内部テンポラリテーブル)について[その2]
- 第131回 mysqldumpslowを使ってスロークエリログを解析してみる
- 第130回 クエリをプロファイリングしてみる
- 第129回 Internal Temporary Table(内部テンポラリテーブル)について[その1]
関連記事
- 第45回 OSSコンソーシアム 第3回データベース比較セミナー開催,MySQL 8.0.16でのCHECK制約追加,PostgreSQL関連ニュース
- 第41回 MySQL& PostgreSQLの2018年の主なニュース
- 第40回 「MySQL Innovation Day 2018 秋」「PostgreSQL Conference Japan 2018」開催
- 第39回 Oracle OpenWorld 2018でのMySQL関連の発表,PostgreSQL 11リリース
- 第36回 MySQL 8.0へのバージョンアップ方法,PostgreSQL 11ベータ2リリース,MongoDB 4.0 リリース