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_