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 回だけ実行されるイベントを作成する方法を学習しました。また、多くの行を含むイベントを作成し、データを更新してから、別のファイルにエクスポートすることも検討しました。