MySQL でイベントスケジューラまたはタイマーを設定する

Mehvish Ashiq 2023年1月30日
  1. MySQLEvent とその重要性
  2. Event スケジューラまたは MySQL でタイマーを設定する
  3. まとめ
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 コマンドがデータベースに保存され、スケジュールされた DATETIME に実行されることを知っておくことも重要です。

イベントを作成することは、次の利点のために重要です。

  • 全員が同じページにいる
  • 目標を設定します
  • スケジュールを管理し、イベントを実行します
  • テーブルの最適化、データの更新に役立ちます
  • オフピーク時に役立つレポートを生成する
  • タスクに優先順位を付けましょう
  • あなたのお金と時間を節約します

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_schedulerON であるためです。

出力:

イベントスケジューラまたは mysql でタイマーを設定-プロセスリストパート a を表示

イベントスケジューラまたは mysql でタイマーを設定-プロセスリストパート b を表示

さまざまな目的で EVENT を作成できます。たとえば、EVENT は 1 回または毎年、または 1 回だけ実行されますが、指定された間隔内で実行されます。サンプルコードの助けを借りて理解を始めましょう。

person データベースに student テーブルがあり、現時点では次のレコードがあります。

イベントスケジューラまたは mysql にタイマーを設定-学生テーブルの現在のデータ

ワンタイムイベントを理解するために、次の 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 には任意の名前を付けることができますが、一意の名前を付けることができます。イベントの一意の名前は、多くのイベントがある場合に作業を容易にします。

出力:

イベントスケジューラまたは mysql でタイマーを設定-学生テーブルで更新されたデータ

CURRENT_TIMESTAMP の 20 秒後に実行される EVENTCREATE する必要があると仮定しましょう。このイベントも 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 秒経過してから確認してください。

イベントスケジューラまたは mysql でタイマーを設定-学生テーブルで 20 秒後にデータを更新

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

SHOW EVENTS FROM classicmodels;

出力:

イベントスケジューラまたは mysql でタイマーを設定-イベントリスト

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 後に期限切れになる EVENTCREATE したい場合はどうでしょうか。これは定期的なイベントと呼ばれます。

次のコードを使用して作成し、練習することができます。

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());

上記のコードでは、STARTSENDS を使用して、EVENT に開始時刻と終了時刻を指示しています。現在は必要ないと思われる場合は、イベントをドロップすることもできます。

次のコードで、nameEVENT 名に置き換えます。

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 本文に複数の行がある場合は、上記のように BEGINEND で囲みます。

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

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook