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_