MySQL でイベントスケジューラまたはタイマーを設定する
このチュートリアルでは、MySQL タイマーとも呼ばれる EVENT の作成について説明します。
MySQL でタイマーを設定して MySQL にデータ(たとえば、UPDATE/INSERT/DELETE データ)を操作させる方法を説明します。また、指定された日時にバックアップを作成します(必要な場合)。
さまざまなシナリオを考慮して、MySQL EVENT を見ていきます。また、その重要性と利点についても話し合います。この記事では、MySQL バージョン 8.0.27 を使用していますが、公式 Web サイトから新しいバージョン(利用可能な場合)を入手できます。
MySQLEvent とその重要性
MySQL EVENT は、列の更新、テーブルの取得、データベースのバックアップなど、一部の操作をスケジュールするために使用されるタスクです。
1 回だけ実行されるか、指定された間隔(たとえば、1 分ごと、1 時間ごと、1 か月ごと、または 1 年ごと)に従って繰り返される EVENT を作成できます。
EVENT を作成するためのステートメントの固定数はありません。EVENT 本体内に多くの行を含めることができます。
EVENT に複数の行がある場合、本文は BEGIN および END ブロックで囲む必要があります。スケジュールされた EVENT コマンドがデータベースに保存され、スケジュールされた DATE と TIME に実行されることを知っておくことも重要です。
イベントを作成することは、次の利点のために重要です。
- 全員が同じページにいる
- 目標を設定します
- スケジュールを管理し、イベントを実行します
- テーブルの最適化、データの更新に役立ちます
- オフピーク時に役立つレポートを生成する
- タスクに優先順位を付けましょう
- あなたのお金と時間を節約します
Event スケジューラまたは MySQL でタイマーを設定する
遅延は、ブランドだけでなく制作チームにとっても非常にコストがかかります。
EVENT をスケジュールするか、特定のフィールド(列)にタイマーを設定してから、プロジェクトレポート用に別のファイルにダンプすると、時間を節約できます。このようにして、他の生産的なタスクに集中できるようになります。
MySQL は、event_scheduler というスレッドを使用してすべてのイベントを実行します。event_scheduler の値が ON の場合、EVENT が実行されます。そうでなければ、そうではありません。
event_scheduler の値を ON に設定するには、次のコマンドを使用する必要があります。
SET GLOBAL event_scheduler = ON;
さて、あなたが EVENT を作成した場合、それが実行されることをどのようにして知ることができますか?次のコマンドを使用して確認してください。
SHOW PROCESSLIST;
event_scheduler の値を ON に設定する前後の出力を見てみましょう。
最初の出力では EVENT を実行できませんが、2 番目の出力では実行できます。これは、2 番目のスクリーンショットでは event_scheduler が ON であるためです。
出力:


さまざまな目的で EVENT を作成できます。たとえば、EVENT は 1 回または毎年、または 1 回だけ実行されますが、指定された間隔内で実行されます。サンプルコードの助けを借りて理解を始めましょう。
person データベースに student テーブルがあり、現時点では次のレコードがあります。

ワンタイムイベントを理解するために、次の EVENT を作成しましょう。サンプルコードを以下に示します。
SET GLOBAL event_scheduler = ON;
CREATE EVENT IF NOT EXISTS ONE_TIME_EVENT
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
INSERT INTO person.student (id, FIRST_NAME, LAST_NAME, GENDER, EMAIL)
VALUES
(7, 'Thomas', 'Christoper', 'Male', 'tchristopher@gmail.com');
上記のコードでは、event_scheduler の値を ON に設定して、EVENT を実行します。
次に、EVENT を作成し、ONE_TIME_EVENT という名前を付けて、CURRENT_TIMESTAMP にスケジュールしました。この EVENT は、CURRENT_TIMESTAMP で 1 回実行され、その後期限切れになることを表します。
この EVENT は、存在しない場合にのみ作成されます。この EVENT の仕事は、student テーブルの行を INSERT することです。
この EVENT を作成して実行した後、student テーブルをチェックして新しいレコードを確認します(次のスクリーンショットを参照)。
EVENT には任意の名前を付けることができますが、一意の名前を付けることができます。イベントの一意の名前は、多くのイベントがある場合に作業を容易にします。出力:

CURRENT_TIMESTAMP の 20 秒後に実行される EVENT を CREATE する必要があると仮定しましょう。このイベントも 1 回だけ実行されます。次のコードを書いて理解してください。
CREATE EVENT IF NOT EXISTS ONE_TIME_EVENT_WITH_INTERVAL
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 20 SECOND
DO
INSERT INTO person.student
VALUES
(8, 'Suzu', 'Aly', 'Fmale', 'aly.suzu@yahoo.com');
出力:
20 秒後に student テーブルに新しいレコードが表示されます。
20 秒前にチェックすると、student テーブルにこの新しい行が表示されないことに注意してください。20 秒経過してから確認してください。

次のコードを使用して、作成およびスケジュールされたイベントの数を確認します。
SHOW EVENTS FROM classicmodels;
出力:

EVENT のいずれかが上のスクリーンショットにリストされていないのはなぜですか?この記事によると、すべてのイベントが現在期限切れになっているためです。
次のように ON COMPLETION PRESERVE 句を使用すると、期限切れかどうかに関係なく、すべてのイベントを追跡できます。
CREATE EVENT TEST_PRESERVE_CLAUSE
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
DO
INSERT INTO tests(test_name,test_date)
VALUES('Testing Preserve Clause',NOW());
CURRENT_TIMESTAMP から始まり、MINUTE ごとに実行され、1 HOUR 後に期限切れになる EVENT を CREATE したい場合はどうでしょうか。これは定期的なイベントと呼ばれます。
次のコードを使用して作成し、練習することができます。
CREATE EVENT RECURRING_EVENT
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
INSERT INTO Tests(test_name,test_date)
VALUES('This is recurring event test',NOW());
上記のコードでは、STARTS と ENDS を使用して、EVENT に開始時刻と終了時刻を指示しています。現在は必要ないと思われる場合は、イベントをドロップすることもできます。
次のコードで、name を EVENT 名に置き換えます。
DROP EVENT [IF EXIST] name;
EVENT を作成し、別の開発者にジョブを引き渡した別の状況を考えてみましょう。コメントなしで理解するのは簡単でしょうか?もちろん違います。
CREATE EVENT そして次のように COMMENT を追加して練習します。
CREATE EVENT RECURRING_EVENT
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
COMMENT 'It will add a new record every minture for one hour'
DO
INSERT INTO Tests(test_name,test_date)
VALUES('This is recurring event test',NOW());
EVENT 本体に 1 行だけで EVENT を学習しました。複数の行がある場合はどうなりますか?次のサンプルコードで理解しましょう。
delimiter |
CREATE EVENT IF NOT EXISTS EVENT_FOR_UPDATE_COLUMNS_AND_DUMP
ON SCHEDULE AT current_timestamp
DO BEGIN
UPDATE student SET GENDER = 'M' WHERE student.GENDER = 'Male';
UPDATE student SET GENDER = 'F' WHERE student.GENDER = 'Female';
Table student INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
END |
delimiter ;
提供されたコードの EVENT 本文に 3つのクエリが表示されます。EVENT 本文に複数の行がある場合は、上記のように BEGIN と END で囲みます。
この例では、CURRENT_TIMESTAMP から始まる EVENT を作成しました。UPDATE ステートメントに従って GENDER 列を更新し、データを .CSV ファイルにエクスポートします。
エクスポートするには、このパス C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.csv を使用する必要があります(MySQL を C ドライブにインストールしている場合)。そうしないと、次のエラーが発生します。
Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
MySQL を別の場所にインストールした場合は、EVENT スケジューラーを使用してから、次のコマンドを使用して、ファイルがエクスポートされるパスを見つけます。
SHOW VARIABLES LIKE "secure_file_priv";
まとめ
このチュートリアルでは、MySQL EVENT スケジューラについて学習しました。
指定された間隔に従って 1 回だけ、指定された間隔に従って 1 回だけ実行されるイベントを作成する方法を学習しました。また、多くの行を含むイベントを作成し、データを更新してから、別のファイルにエクスポートすることも検討しました。
