はじめに
最近使用されたmysqlのイベントは、学習の波に、記録します。イベント関数の追加後の5.7からmysqlは、Linuxのcrontabに似て、特定のタスクの1回または定期的な実行に使用される時限タスクです。
イベントの主な特徴と特性:
1. mysql のイベントは、その名前とスキーマによってイベントを一意に識別します。
2.イベントはSQLステートメントまたはBEGIN-ENDコードのブロックで構成することができます。イベントは、1回または定期的に実行することができ、定期的な実行は、通常の開始時刻と終了時刻に設定することができ、あなたはまた、開始時刻と終了時刻を別々に設定することができ、または設定しないことができます。デフォルトでは、時間指定タスクが正常に設定されている限り、イベントが利用できなくなるか削除されるまで実行され続けます。
ここで注意すべき点は、イベントが1サイクル内に実行されなかった場合、そのイベントの別のインスタンスも実行を開始するということです。例えば、イベント A が 1 分間に 1 回実行されるように設定されていて、実行が終了していない場合、2 分後に実行が開始され、同様に実行が開始される別の新しいイベント・インスタンスが存在します。これらのインスタンス間でリソースの競合が発生すると、mysql サービスが非常に遅くなる可能性があります。
3.ユーザーはイベントの作成、変更、削除ができます。構文的に正しくない create や modify 文はエラー・メッセージを投げます。ユーザが権限を持たないアクション文をイベント・アクションに記述すると、作成と変更は成功しますが、アクションが実行されると例外がスローされます。例えば、ユーザがテーブルAに対してselect権限しか持たず、イベント内でテーブルAを更新した場合、イベントはテーブルの作成や変更は成功しますが、実行時にエラーがスローされます。
4. sqlステートメントは、イベント名、時間、実行期間、ステータス、スキーマなどを変更できます。
5.イベントの作成者は、デフォルトではイベントを作成したユーザーですが、他のユーザーもイベントを変更した場合、イベントの作成者は、最後にイベントを変更したユーザーに変更されます。ユーザーがデータベース内でイベントを変更する権限を持っている限り、そのユーザーはイベントの内容を変更することができます。
eventの設定は
eventのパラメータ値はevent_schedulerと呼ばれ、NO、OFF、DISABLEDの3つの値があります。注意: コマンドラインで設定されたパラメータ値はmysqlの再起動後に無効になりますが、設定ファイルで変更された値だけは再起動後も無効になりません。
イベントの有効化:mysqlのコマンドラインに入力します:
SET GLOBAL event_scheduler = ON;
SET @@GLOBAL.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@GLOBAL.event_scheduler = 1;
イベント終了
SET GLOBAL event_scheduler = OFF;
SET @@GLOBAL.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@GLOBAL.event_scheduler = 0;
ONと1、OFFと0は等価ですが、対応する数値がないDISABLEDという値もあるため、できるだけONとOFFを使うようにしてください。注意:イベントスケジューラをDISABLEDに設定できるのは、サーバー起動時のみです。 event_schedulerがONまたはOFFの場合、実行時にDISABLEDに設定することはできません。 また、イベントスケジューラを起動時にDISABLEDに設定した場合、実行時に変更することはできません。 event_schedulerはDISABLEDに設定されます。実行時のスケジューラ値。
イベントを使用不可に設定するには、2つの方法があります:
--event-scheduler=DISABLED
設定ファイル
event_scheduler=DISABLED
eventイベントの構文は
eventイベントの作成:
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;
schedule: {
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
これは、仕様の公式な作成です、それは少し圧倒的に見える、次を理解するための例です。1分ごとに実行するselect文を作成するために、次の例を使います。
CREATE EVENT test_insert
ON SCHEDULE EVERY 1 MINUTE
DO (クエリ文を実行する)
SELECT NOW();
上記は単一ステートメントのイベントですが、ステートメントが複合ステートメントの場合は、BEGIN-ENDを使用して完了します。
delimiter //
CREATE EVENT test_insert
ON SCHEDULE
EVERY 1 MINUTE
COMMENT 'イベントによって追加されるメモ'
DO
BEGIN
INSERT INTO XXX;
UPDATE XXX;
END //
delimiter ;
読者は、ストアドプロシージャを書いている場合、それはこの複数行のステートメントを理解することは容易であり、ストアドプロシージャの構文は、イベントを作成するプロセスの追加の外側だけで大差ありません書き込みます。イベントはまた、プロシージャを呼び出すために定期的にすることができ、コンテンツは、ストアドプロシージャに実行され、その後、イベントを呼び出すために使用する直接イベント内のすべてのロジックを記述するよりも良いでしょう。イベントの実行は、エラーメッセージがないため、エラーログはありません、それはデバッグすることは困難です。ストアドプロシージャに書き込んだ場合、手動でストアドプロシージャを呼び出すことができ、問題があれば、エラーメッセージに基づいて直接ステートメントの問題の有無を確認することができます。
イベントを変更します:
基本的には作成するのと同じで、公式の仕様書がそのまま掲載されています。
ALTER
[DEFINER = user]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
[DO event_body]
イベントを削除します:
イベントの削除は、イベントの名前に基づいて行われます。
DROP EVENT [IF EXISTS] event_name
イベントのメタデータを見てください:
イベントを表示する3つの方法
SELECT * FROM INFORMATION_SCHEMA.EVENTS;
SHOW EVENTS;
SELECT * FROM mysql.event;
イベントを作成するcreate文を見てみよう:
SHOW CREATE EVENT
イベント権限の付与
イベントに対する権限は EVENT と呼ばれます。 以下は、ホスト上のユーザ user にデータベースのテーブル table event に対する権限を与える一般的な代入文です。
GRANT EVENT ON database.table TO user@host;
まとめ
1.イベントはmysqlに相当する時限タスクが付属しています、そのような特定のテーブルの統計情報を計算するために毎月のように、仕事の周期性のいくつかに対処するために使用することができます。それはより便利です。
2イベントの機能は十分に強力ではない、デバッグは、実際にはもっと面倒であり、エラーメッセージを印刷しない、それはあなたが直接CALLは、ステートメントに問題があるかどうかを判断するためにイベントで実行されるストアドプロシージャを呼び出すことができるように、イベントでストアドプロシージャを呼び出すことをお勧めします。もう1つの方法は、イベントの実行に書き込むには、ログテーブルにイベントのデータ情報の実行を値に、イベントの実行がないように、エラーレポートが一目瞭然かどうか。
3イベントの間隔が合理的に設定する必要があります、イベントが同時に実行することができますので、最初のイベントが実行されていない場合だけでなく、行のロックまたはテーブルのロックを取ると、実行の2番目のイベントは、ブロックされますまだ終了していない、再びイベントの背面。これは非常に低いレベルにデータベースのパフォーマンスが低下する可能性があります。