はじめに
MySQLイベントは、ユーザー定義のスケジュールに従って実行されるタスクです。 。イベントスケジューラは、スケジュールされた時間にイベントを実行する特別なスレッドです。
MySQLイベントは、データベース管理と定期的なデータベース運用タスクを容易にするため、役立ちます。
このチュートリアルでは、MySQLイベントとは何か、およびそれらを設定して使用する方法を学習します。
前提条件:
- データベースサーバー上でMySQLを実行しているシステム
- root権限を持つMySQLユーザーアカウント
MySQLイベントスケジューラとは何ですか?
MySQL Event Schedulerは、バックグラウンドで実行され、スケジュールされたイベントの実行を管理するスレッドです。グローバル変数event_scheduler
でない限り、スケジューラはスリープ状態です。 ON
に設定されています または1
。
MySQLイベントスケジューラは、MySQLのCronジョブの代替を表します 。イベントスケジューラのいくつかの利点は次のとおりです。
- MySQLサーバーに直接書き込まれます。
- プラットフォームやアプリケーションに依存しません。
- 定期的なデータベースの更新またはクリーンアップが必要な場合はいつでも使用できます。
- クエリのコンパイル回数を減らします。
MySQLイベントスケジューラの構成
MySQLイベントスケジューラの状態は、スケジューラをオンに設定するように構成できます。 、オフ 、または無効
イベントスケジューラの状態を確認するには、次のコマンドを実行します。
SHOW processlist;
event_scheduler
結果に表示されるシステム変数は、イベントスケジューラの状態を示します。ここでは、 event_scheduler
可変状態は空のキューで待機中です 、これは、スケジューラがオンになっていて、イベントがトリガーするのを待っていることを意味します。
考えられる状態は次のとおりです。
オンコード>
:イベントスケジューラスレッドが実行され、スケジュールされたすべてのイベントが実行されます。これは、スケジューラのデフォルトの状態です。スケジューラがON
の場合 、SHOWプロセスリスト
コマンド出力はそれをデーモンプロセスとしてリストします。
イベントスケジューラをON
にするには 、次のコマンドを実行します:
SET GLOBAL event_scheduler = ON;
値ON
1
と互換性があります 。
オフコード>
:イベントスケジューラスレッドが実行されておらず、SHOW processlist
の出力に表示されません 。イベントスケジューラがOFF
に設定されている場合 、スケジュールされたイベントは実行されません。
イベントスケジューラをOFF
にするには 、次のコマンドを実行します:
SET GLOBAL event_scheduler = OFF;
値OFF
0
と互換性があります 。
無効
:この状態は、イベントスケジューラが動作していないことを意味します。スレッドは実行されず、SHOWプロセスリスト
の出力に表示されません コマンド。
イベントスケジューラを無効にするには、サーバーの起動時に次のコマンドラインオプションを追加します。
--event-scheduler=DISABLED
MySQLイベントスケジューリング
イベントは、指定された時間または定期的に実行されるSQLステートメントを含むデータベースオブジェクトです。イベントは特定の日時に開始および終了します。
MySQLイベントはユーザーが指定した時間に実行されるため、これらのイベントは一時的とも呼ばれます。 トリガー 。ただし、特定のイベントに応答して実行されるデータベースオブジェクトであるMySQLトリガーと混同しないでください。したがって、イベントという用語を使用することをお勧めします 混乱を避けるためにスケジュールされたタスクを参照する場合。
次のセクションでは、作成の方法について説明します 、表示 、変更 または削除 イベント。
新しいイベントを作成する
新しいイベントを作成するには、次の構文を使用します。
CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body
存在しない場合
ステートメントは、イベント名が使用中のデータベースに固有であることを確認します。 event_name
の代わりに一意のイベント名を指定してください 構文。イベントの実行スケジュールは、 ON SCHEDULE
の後に指定されます 声明。イベントは1回限りのイベントにすることができます または定期的なイベント 。
event_body
の代わりにSQLステートメントを入力してください DO
の後の構文 キーワード。イベント本体には、ストアドプロシージャ、単一のクエリ、または複合ステートメントを含めることができます。 BEGIN END
内に複合ステートメントを記述します ブロック。
イベントのスケジュール
イベントは、後で実行するか、定期的に実行するようにスケジュールできます。
ワンタイムイベント
1回限りのイベントは一度だけ実行され、その後自動的に削除されます。
1回限りのイベントを作成するには、 ON SCHEDULE
の後にタイムスタンプを指定します 次の構文を使用したステートメント:
AT timestamp + [INTERVAL interval]
間隔の可能な選択肢 は:
- 年
- 四半期
- 月
- 日
- 時間
- 分
- 週
- 2番目
- YEAR_MONTH
- DAY_HOUR
- DAY_MINUTE
- DAY_SECOND
- HOUR_MINUTE
- HOUR_SECOND
- MINUTE_SECOND
タイムスタンプはDATETIME
である必要があります またはTIMESTAMP
将来の価値。正確な時刻を指定するには、 + INTERVAL
を使用してタイムスタンプに間隔を追加します 、正の整数、および間隔の選択肢の1つ。これは、 CURRENT_TIMESTAMP
を使用する場合にのみ適用されることに注意してください 機能。
例:
ここでは、イベントは作成から2日後に発生し、タスクは testという名前のテーブルを削除することです。 。
イベントは実行後に自動的にドロップされます。イベントをデータベースに保存する場合は、 ON COMPLETION PRESERVE
を追加します イベントを作成するときの句。
定期的なイベント
定期的なイベントは、指定された時間に繰り返し発生します。定期的なイベントをスケジュールするには、 ON SCHEDULE
の後に次の構文を使用します ステートメント:
EVERY interval
STARTS timestamp [+ INTERVAL]
ENDS timestamp [+ INTERVAL]
STARTS
キーワードは、イベントの実行がいつ開始されるかを指定し、 ENDS
キーワードは、イベントの実行をいつ停止するかを指定します。
例:
このイベントにより、MySQLは6か月に1回、すぐに開始してテーブルテストをドロップします。
後でイベントを開始する間隔を指定することもできます。例:
イベントの開始時刻と終了時刻を指定することもできます:
このイベントにより、MySQLは testという名前のテーブルを削除します。 今から5日後から5年間、6か月に1回。
イベントを表示
次のコマンドは、データベースに保存されているすべてのイベントを表示します。
SHOW EVENTS FROM database_name;
1回限りのイベントは実行後に自動的に削除され、 SHOW EVENTS
の出力には表示されないことに注意してください。 ON COMPLETION PRESERVE
を使用しない限り、コマンド イベントを作成するときの句。
出力には、指定したデータベースに保存されているすべてのイベントが一覧表示されます。
イベントの変更
ALTER EVENT
を使用します 既存のイベントを変更するステートメント:
ALTER EVENT event_name
[ ON SCHEDULE schedule ]
[ RENAME TO new_event_name ]
[ ON COMPLETION [ NOT ] PRESERVE ]
[ COMMENT 'comment' ]
[ ENABLED | DISABLED ]
[ DO sql_statement ]
event_name
すでに存在するイベントである必要があります。 ALTER EVENT
以降のすべてのステートメント 何を変更するかに応じて、オプションです。 ALTER EVENT
の句を省略します コマンドは、それらが以前の状態のままであることを意味します。含まれる句は、指定した新しい値が適用されることを意味します。
例:
この例では、イベントの名前を変更し、SQLステートメントを変更しました。
イベントの削除(イベントの削除)
イベントを削除(ドロップ)するには、次の構文を使用します。
DROP EVENT [IF EXISTS] event_name;
例:
このアクションは完全に削除します データベースからのイベント。
IF EXISTS
を使用する そのようなイベントが存在しない場合、ステートメントは警告を発行します:
MySQLイベントの制限
MySQLイベントを使用する際に考慮すべき特定の制限があります。それらのいくつかは次のとおりです:
- イベントは結果セットを返すことはできません。出力はdev/nullに送信され、イベントは失敗するか、ユーザーに通知せずに成功します。
- イベント名では大文字と小文字は区別されません。 2つのイベントに、大文字と小文字が異なる同じ名前を付けることはできません。
- イベントは2038年1月19日以降にスケジュールすることはできません。これは、Unixエポックで表現できる最大数です。
- イベントは、別のストアドプログラム、トリガー、またはイベントによって作成、削除、または変更することはできません。
- イベントは、ストアドプログラムまたはトリガーを作成、削除、または変更できません。
- 間隔
MONTH
、YEAR_MONTH
、QUARTER
、およびYEAR
数ヶ月で解決されます。他のすべての間隔は秒単位で解決されます。 - 同じスケジュールで2つのイベントが発生する可能性がありますが、実行順序を強制する方法はありません。
- イベントは常に定義者権限で実行されます。スレッドは、イベントを作成したユーザーとして機能するイベントを、そのユーザーの権限で実行します。ユーザーを削除しても、ユーザーが作成したイベントは削除されないことに注意してください。
- イベントはステートメントの実行回数を変更しません。つまり、
SHOW STATISTICS
には影響しません。 コマンド。 - イベントを実行するための最大遅延は2秒です。ただし、 information_schema.events テーブルには、常にイベント実行の正確な時刻が表示されます。
- ストアドルーチン内のプリペアドステートメント内のローカル変数への参照の代わりに、ユーザー定義変数を使用します。
- 再帰呼び出しの数は
max_sp_recursion_depth
に制限されています 。この変数がデフォルト値である0の場合、再帰は無効になります。 -
START TRANSACTION
を使用しますBEGIN WORK
の代わりにステートメント 、BEGIN WORK
以降BEGIN END
の開始として扱われます ブロックします。 - ストアドプロシージャのその他の制限は、イベントにも適用されます。