鉛:
最近、mysqlイベントを使用したので、波を学び、それを記録しました。
MySQLは5.7からイベント関数を追加しました。これは、特定のタスクを一度にまたは定期的に実行するために使用される時限タスクであるlinux crontabに似ています。
イベントの主な機能と属性:
1. mysqlのイベントは、名前とスキーマに基づいてイベントを一意に識別します。
2.イベントは、SQLステートメントまたはBEGIN-ENDコードブロックで構成できます。イベントは1回だけ実行することも、定期的に実行することもできます。定期実行は、通常の開始時刻と終了時刻で設定するか、開始時刻と終了時刻を別々に設定するか、どちらも設定しないでください。
デフォルトでは、タイミングタスクが正常に設定されている限り、イベントが使用不可になるか削除されるまで実行され続けます。
ここでの注意点:イベントがサイクルで実行されない場合、別のイベントインスタンスも実行を開始します。たとえば、Aイベントが1分に1回実行されるように設定されており、2分目が完了していない場合、この時点で別の新しいイベントインスタンスも実行を開始します。これらのインスタンスがリソースをめぐって競合している場合、MySQLサービスが非常に遅くなる可能性があります。
3.ユーザーは、イベントを作成、変更、および削除できます。構文的に正しくない作成または変更ステートメントは、エラーメッセージを直接スローします。ユーザーは、イベントのアクションで許可されていない操作ステートメントを
作成できます。作成および変更は成功する可能性がありますが、実行時に例外がスローされます。たとえば、ユーザーはテーブルAの選択権限しか持っていません。彼はイベントでテーブルAを更新します。イベントは正常に作成または変更できますが、実行するとエラーが報告されます(これは穴です。書き込み後に問題ないと思いましたが、結果は
実行時にのみ問題が発生するかどうかがわかります)。
4. sqlステートメントは、イベント名、時間、実行サイクル、ステータス(有効または無効)、スキーマなどを変更できます。
5.イベントの作成者は、デフォルトでイベントを作成したユーザーですが、他のユーザーもイベントを変更した場合、イベントの作成者は、イベントを変更した最後のユーザーに変更されます。ユーザーがデータベースのイベントを変更する権限を持っている限り、イベントの内容を変更できます。
イベント設定:
イベントのパラメーター値は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の値は実行時に変更できません。
イベントを使用不可に設定するには2つの方法があります。2つの
コマンドラインがあります。
--event-scheduler=DISABLED
設定ファイル
event_scheduler=DISABLED
イベントの構文:
1.イベントの作成:
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}
これは公式の作成仕様であり、少し困難に見えますが、理解を助けるために例を見てみましょう。
毎分実行するselectステートメントを作成してみましょう(実際には、クエリはデモのように無意味です)
CREATE EVENT test_insert (创建名为test_insert的event)
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 ;
リーダーがストアドプロシージャを記述している場合、この複数行のステートメントを理解するのは簡単です。これは、イベントを作成するプロセスが追加されていることを除いて、ストアドプロシージャを記述する構文とほとんど変わりません。
イベントは、ストアドプロシージャを定期的に呼び出し、実行するコンテンツをストアドプロシージャに入れ、すべてのロジックをイベントに直接書き込むのではなく、イベントを使用して呼び出すこともできます。
イベントの実行にはエラーメッセージがなく、エラーログもないため、デバッグは困難です。ストレージプロセスにある場合は、ストレージプロセスを手動で呼び出すことができます。問題がある場合は、エラーメッセージに基づいてステートメントの問題を直接確認できます。
2.イベントを変更します。
基本的には、公式仕様書を作成して直接貼り付けるのと同じです。
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]
3.イベントを削除します。
イベントの削除は、イベントの名前に基づいています。
DROP EVENT [IF EXISTS] event_name
4.イベントのメタデータを表示します。
查看事件的三种方式:
SELECT * FROM INFORMATION_SCHEMA.EVENTS;
SHOW EVENTS;
SELECT * FROM mysql.event;
查看创建event的创建语句:
SHOW CREATE EVENT
5.イベント権限を付与する
イベントの権限はEVENTと呼ばれます。以下は、ホスト上のデータベーステーブルイベントの権限をユーザーuserに付与する一般的な権限付与ステートメントです。
GRANT EVENT ON database.table TO user@host;
総括する:
1.eventは、mysqlに付属するタイミングタスクに相当します。これは、特定のテーブルの統計を毎月計算するなど、いくつかの定期的なタスクを処理するために使用できます。もっと便利。
2.イベントの機能は十分に強力ではなく、デバッグは実際にはより面倒で、エラーメッセージは出力されません。イベントで実行されるストアドプロシージャを直接呼び出すことで、ステートメントに問題があるかどうかを判断できるように、イベントでストアドプロシージャを呼び出すことをお勧めします。もう1つの方法は、イベントが実行されたときに実行イベントのデータ情報をログテーブルに書き込むことで、イベントが実行されたかどうか、およびエラーが一目でレポートされるかどうかを明確にすることです。
3.イベントは同時に実行できるため、イベントの間隔は適切に設定する必要があります。最初のイベントが実行されず、行ロックまたはテーブルロックがまだ保持されている場合、2番目のイベントは実行時にブロックされ、まだ実行されていません。 、次のイベントが再びここにあります。これにより、データベースのパフォーマンスが非常に低下する場合があります。