MySQL イベントスケジューラ

MySQLBeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、MySQL のイベントスケジューラを使用してデータベースタスクを自動化する方法を学びます。イベントスケジューラは、指定された時間または間隔で SQL ステートメントを実行する MySQL の機能です。これは、データベースメンテナンス、データクリーンアップ、定期的なレポート作成などの定型タスクを自動化するのに役立ちます。

イベントスケジューラの有効化、データベースとテーブルの作成、データの変更を定期的に行うイベントのスケジュール設定、イベント実行の検証、そして最後にイベントの削除までを順を追って説明します。この実験 (Lab) の終わりには、MySQL イベントスケジューラの基本的な使い方を理解できるようになります。

イベントスケジューラの有効化

MySQL のイベントスケジューラは、スケジュールされたイベントを実行するバックグラウンドスレッドとして動作します。デフォルトでは、この機能は無効になっています。最初のステップは、これを有効にすることです。

まず、デスクトップからターミナルを開きます。

root ユーザーとして MySQL サーバーに接続します。この実験 (Lab) 環境では、パスワードなしで接続するために sudo を使用できます。

sudo mysql -u root

接続すると、MySQL プロンプト (mysql>) が表示されます。

以下のコマンドで、イベントスケジューラの現在のステータスを確認します。

SHOW GLOBAL VARIABLES LIKE 'event_scheduler';

出力では、デフォルトで event_schedulerOFF になっていることが示されます。

+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| event_scheduler  | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

イベントスケジューラを有効にするには、以下のコマンドを実行します。この設定はグローバルであり、サーバーが実行されている間は永続します。

SET GLOBAL event_scheduler = ON;

ステータスを再度確認して、変更が成功したことを検証します。

SHOW GLOBAL VARIABLES LIKE 'event_scheduler';

出力は値が ON と表示され、イベントスケジューラがアクティブであることを確認できるはずです。

+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| event_scheduler  | ON    |
+------------------+-------+
1 row in set (0.00 sec)

イベントスケジューラが有効になったので、次のステップに進むことができます。

データベースとテーブルの作成

スケジュールされたイベントを作成する前に、イベントが対話するためのデータベースとテーブルが必要です。このステップでは、test_db という名前のデータベースと event_logs という名前のテーブルを作成します。

MySQL シェル内で、test_db データベースを作成します。IF NOT EXISTS 句は、データベースが既に存在する場合のエラーを防ぎます。

CREATE DATABASE IF NOT EXISTS test_db;

新しく作成されたデータベースに切り替えて、以降のコマンドの現在のデータベースにします。

USE test_db;

Database changed という確認メッセージが表示されます。

次に、event_logs テーブルを作成します。このテーブルには、自動インクリメントされる id と、イベントが更新する counter 列があります。

CREATE TABLE event_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    counter INT NOT NULL
);

最後に、event_logs テーブルに初期行を挿入し、開始値を 0 とします。これにより、イベントが更新できるレコードが提供されます。

INSERT INTO event_logs (id, counter) VALUES (1, 0);

以下のコマンドを実行して、テーブルが作成され、データが正しく挿入されたことを確認できます。

SHOW TABLES;
SELECT * FROM event_logs;

出力には event_logs テーブルと、id = 1counter = 0 の単一行が表示されるはずです。

+-----------------+
| Tables_in_test_db |
+-----------------+
| event_logs      |
+-----------------+
1 row in set (0.00 sec)

+----+---------+
| id | counter |
+----+---------+
|  1 |       0 |
+----+---------+
1 row in set (0.00 sec)

データベースとテーブルの準備ができたので、スケジュールされたイベントを作成できます。

繰り返しイベントの作成

次に、定期的に実行されるイベントを作成します。このイベントは、10 秒ごとに event_logs テーブルの counter の値をインクリメントします。

引き続き test_db データベースを使用していることを確認してください。

USE test_db;

update_counter_event という名前のイベントを作成します。

CREATE EVENT update_counter_event
ON SCHEDULE EVERY 10 SECOND
DO
  UPDATE event_logs SET counter = counter + 1 WHERE id = 1;

このステートメントを分解してみましょう。

  • CREATE EVENT update_counter_event: update_counter_event という名前の新しいイベントを定義します。
  • ON SCHEDULE EVERY 10 SECOND: イベントが 10 秒ごとに実行されることを指定します。
  • DO UPDATE ...: これはイベントが実行する SQL ステートメントです。id1 の行の counter をインクリメントします。

イベントが正常に作成されたことを確認するには、SHOW EVENTS コマンドを使用します。

SHOW EVENTS;

出力には新しいイベントとその詳細が一覧表示されます。StatusENABLED になっていることを確認してください。

+---------+----------------------+---------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| Db      | Name                 | Definer       | Time zone | Type      | Execute at | Interval value | Interval field | Starts              | Ends | Status  | Originator | character_set_client | collation_connection | Database Collation |
+---------+----------------------+---------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| test_db | update_counter_event | root@localhost| SYSTEM    | RECURRING | NULL       | 10             | SECOND         | 2024-05-27 12:00:00 | NULL | ENABLED |          1 | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+---------+----------------------+---------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

注:DefinerStarts の時間は異なる場合があります。

イベントは現在アクティブであり、実行がスケジュールされています。次のステップでは、期待どおりにデータが更新されているかを確認します。

イベント実行の確認

イベントがスケジュールされたので、正しく実行されていることを確認する必要があります。イベントは 10 秒ごとに実行されるため、時間の経過とともに counter の値が増加しているはずです。

現在の値を確認するために event_logs テーブルをクエリします。

SELECT * FROM event_logs WHERE id = 1;

ここで、counter2 または小さい数値になっている可能性があります。

+----+---------+
| id | counter |
+----+---------+
|  1 |       2 |
+----+---------+
1 row in set (0.00 sec)

イベントが少なくとも一度実行されるように、約 15〜20 秒待ちます。その後、再度 SELECT クエリを実行します。

SELECT * FROM event_logs WHERE id = 1;

counter の値が増加していることを確認できるはずです。

+----+---------+
| id | counter |
+----+---------+
|  1 |       3 |
+----+---------+
1 row in set (0.00 sec)

さらに待ってからクエリを再度実行すると、値は増加し続け、update_counter_event がスケジュールどおりに正常に実行されていることが確認できます。これは、MySQL における自動化された時間ベースのタスクの強力さを示しています。

イベントの削除

スケジュールされたイベントが不要になった場合は、不要なリソース消費を防ぐために削除することが推奨されます。この最後のステップでは、update_counter_event を削除します。

イベントを削除するには、DROP EVENT ステートメントを使用します。イベントが既に削除されている場合にエラーを回避するために、IF EXISTS 句を使用することが推奨されます。

DROP EVENT IF EXISTS update_counter_event;

イベントが削除されたことを確認するには、再度 SHOW EVENTS コマンドを実行します。

SHOW EVENTS;

出力は空のセットになり、test_db データベースにスケジュールされたイベントがこれ以上ないことを確認できます。

Empty set (0.00 sec)

update_counter_event はこれ以上実行されなくなります。しばらく待ってから event_logs テーブルを再度クエリすることでこれを(counter の値が増加しなくなることで)確認できます。

これで、MySQL イベントのライフサイクルを正常に管理できました。MySQL シェルを終了できます。

exit;

まとめ

この実験では、MySQL Event Scheduler を使用したタスク自動化の基本を学びました。スケジューラを有効にし、データベースとテーブルを設定し、データを自動的に更新する定期的なイベントを作成しました。また、イベントのステータスと実行を確認し、不要になったイベントを削除する方法も学びました。

これらのスキルは、幅広いデータベース管理およびメンテナンスタスクの自動化に役立ち、データの整合性を確保し、手作業の負荷を軽減するのに役立ちます。