MySQLイベントスケジューラ(Event Scheduler)の紹介
7518 ワード
一、紹介
イベントスケジューラはMySQL 5.1に追加されたもう一つの特色機能で、オペレーティングシステムのタスクスケジューラでしかできない一部のタイミング機能に取って代わるタイミングタスクスケジューラとして使用できます.また、MySQLのイベントスケジューラは、リアルタイム性が要求される環境で非常に実用的なタスクを毎秒実行できます.
イベントスケジューラはタイミングトリガで実行され、この角度から「一時的なトリガ」とも呼ばれる.トリガは、テーブルで生成されたイベントに対していくつかの文を実行するだけで、イベントスケジューラは、ある(間隔)時間にいくつかの文を実行します.イベントは、特定のスレッドによって管理されます.つまり、いわゆる「イベントスケジューラ」です.イベントスケジューラを有効にすると、SUPER権限を持つアカウントがSHOW PROSCESSLISTを実行すると、このスレッドが表示されます.グローバル変数event_を設定することでschedulerの値を使用すると、イベントスケジューラが有効になっているかどうかを動的に制御できます.
この機能を使用する前にevent_を確認する必要があります.schedulerがオープンし、実行可能
または
をオンにします.
現在イベントスケジューラが起動しているかどうかを確認するには、次のSQLを実行します.
または
二、イベントの作成(CREATE EVENT)
まず文法を見てみましょう.
schedule: AT TIMESTAMP [+ INTERVAL INTERVAL] | EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
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)まず簡単な例を見て、1秒間に1本ずつデータテーブルに記録する
3秒待ってから、クエリーを実行してみます.
+———————+ | timeline | +———————+ | 2007-07-18 20:44:26 | | 2007-07-18 20:44:27 | | 2007-07-18 20:44:28 | +———————+
2)5日後にtestテーブルを空にします.
3)2007年7月20日12時ちょうどにtest表を空にする:
4)毎日定時にtest表を空にする:
5)5日後毎日定時クリアtest表を開く:
6)毎日定時にtest表を空にし、5日後に実行を停止する.
7)5日後に毎日定時クリアtest表を開き、1ヶ月後に実行を停止する:
[ON COMPLETION[NOT]PRESERVE]このイベントを一度実行するか永続的に実行するかを設定できます.デフォルトはNOT PRESERVEです.
8)毎日定時にtestテーブルを空にします(一度だけ実行し、タスクが完了したらイベントを終了します):
[ENABLE|DISABLE]ただし、イベント作成後のステータスがオンまたはオフになっているかどうかを設定します.デフォルトはENABLEです.[COMMENT'comment']は、このイベントにコメントを付けることができます.
三、修正イベント(ALTER EVENT)
ALTER EVENT event_name [ON SCHEDULE schedule] [RENAME TO new_event_name] [ON COMPLETION [NOT] PRESERVE] [COMMENT 'comment'] [ENABLE | DISABLE] [DO sql_statement]
1)一時停止イベント
2)オープンイベント
3)毎日のクリアtest表を5日間のクリアに変更:
四、削除イベント(DROP EVENT)
文法は簡単です.以下に示します.
たとえば、前に作成したe_を削除します.testイベント
もちろんこのイベントが存在することが前提ですが、そうでないとERROR 1513(HY 000):Unknown eventエラーが発生するので、IF EXISTSを加えたほうがいいです
五、続き
この特性は確かに非常に有用であり、データテーブルをタイミング的に空にしたり、サーバからプライマリ・スレーブを監視したり、データをまとめたりして、毎秒まで正確にすることができ、リアルタイム性も保障されます.SQL文のスケジューリングに加えて、MYSQLのスケジューラはストレージ・プロシージャをスケジューリングすることもできます.
しかし、2つのイベントが同じオブジェクトに対して競合する場合、この状況は私が理解している問題なのか、それとも確かにそうなのか、例えば毎秒挿入とタイミング削除が競合する.
イベントスケジューラはMySQL 5.1に追加されたもう一つの特色機能で、オペレーティングシステムのタスクスケジューラでしかできない一部のタイミング機能に取って代わるタイミングタスクスケジューラとして使用できます.また、MySQLのイベントスケジューラは、リアルタイム性が要求される環境で非常に実用的なタスクを毎秒実行できます.
イベントスケジューラはタイミングトリガで実行され、この角度から「一時的なトリガ」とも呼ばれる.トリガは、テーブルで生成されたイベントに対していくつかの文を実行するだけで、イベントスケジューラは、ある(間隔)時間にいくつかの文を実行します.イベントは、特定のスレッドによって管理されます.つまり、いわゆる「イベントスケジューラ」です.イベントスケジューラを有効にすると、SUPER権限を持つアカウントがSHOW PROSCESSLISTを実行すると、このスレッドが表示されます.グローバル変数event_を設定することでschedulerの値を使用すると、イベントスケジューラが有効になっているかどうかを動的に制御できます.
この機能を使用する前にevent_を確認する必要があります.schedulerがオープンし、実行可能
1
SET
GLOBAL
event_scheduler = 1;
または
1
SET
GLOBAL
event_scheduler =
ON
;
をオンにします.
1
mysqld ...
--event_scheduler=1
現在イベントスケジューラが起動しているかどうかを確認するには、次のSQLを実行します.
1
SHOW VARIABLES
LIKE
'event_scheduler'
;
または
1
SELECT
@@event_scheduler;
二、イベントの作成(CREATE EVENT)
まず文法を見てみましょう.
1
CREATE
EVENT [IF
NOT
EXISTS] event_name
2
ON
SCHEDULE schedule
3
[
ON
COMPLETION [
NOT
] PRESERVE]
4
[ENABLE | DISABLE]
5
[COMMENT
'comment'
]
6
DO sql_statement;
schedule: AT TIMESTAMP [+ INTERVAL INTERVAL] | EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
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)まず簡単な例を見て、1秒間に1本ずつデータテーブルに記録する
1
USE test;
2
CREATE
TABLE
aaa (timeline
TIMESTAMP
);
3
CREATE
EVENT e_test_insert
4
ON
SCHEDULE EVERY 1
SECOND
5
DO
INSERT
INTO
test.aaa
VALUES
(
CURRENT_TIMESTAMP
);
3秒待ってから、クエリーを実行してみます.
1
SELECT
*
FROM
aaa;
+———————+ | timeline | +———————+ | 2007-07-18 20:44:26 | | 2007-07-18 20:44:27 | | 2007-07-18 20:44:28 | +———————+
2)5日後にtestテーブルを空にします.
1
CREATE
EVENT e_test
2
ON
SCHEDULE
AT
CURRENT_TIMESTAMP
+ INTERVAL 5
DAY
3
DO
TRUNCATE
TABLE
test.aaa;
3)2007年7月20日12時ちょうどにtest表を空にする:
1
CREATE
EVENT e_test
2
ON
SCHEDULE
AT
TIMESTAMP
'2007-07-20 12:00:00'
3
DO
TRUNCATE
TABLE
test.aaa;
4)毎日定時にtest表を空にする:
1
CREATE
EVENT e_test
2
ON
SCHEDULE EVERY 1
DAY
3
DO
TRUNCATE
TABLE
test.aaa;
5)5日後毎日定時クリアtest表を開く:
1
CREATE
EVENT e_test
2
ON
SCHEDULE EVERY 1
DAY
3
STARTS
CURRENT_TIMESTAMP
+ INTERVAL 5
DAY
4
DO
TRUNCATE
TABLE
test.aaa;
6)毎日定時にtest表を空にし、5日後に実行を停止する.
1
CREATE
EVENT e_test
2
ON
SCHEDULE EVERY 1
DAY
3
ENDS
CURRENT_TIMESTAMP
+ INTERVAL 5
DAY
4
DO
TRUNCATE
TABLE
test.aaa;
7)5日後に毎日定時クリアtest表を開き、1ヶ月後に実行を停止する:
1
CREATE
EVENT e_test
2
ON
SCHEDULE EVERY 1
DAY
3
STARTS
CURRENT_TIMESTAMP
+ INTERVAL 5
DAY
4
ENDS
CURRENT_TIMESTAMP
+ INTERVAL 1
MONTH
5
DO
TRUNCATE
TABLE
test.aaa;
[ON COMPLETION[NOT]PRESERVE]このイベントを一度実行するか永続的に実行するかを設定できます.デフォルトはNOT PRESERVEです.
8)毎日定時にtestテーブルを空にします(一度だけ実行し、タスクが完了したらイベントを終了します):
1
CREATE
EVENT e_test
2
ON
SCHEDULE EVERY 1
DAY
3
ON
COMPLETION
NOT
PRESERVE
4
DO
TRUNCATE
TABLE
test.aaa;
[ENABLE|DISABLE]ただし、イベント作成後のステータスがオンまたはオフになっているかどうかを設定します.デフォルトはENABLEです.[COMMENT'comment']は、このイベントにコメントを付けることができます.
三、修正イベント(ALTER EVENT)
ALTER EVENT event_name [ON SCHEDULE schedule] [RENAME TO new_event_name] [ON COMPLETION [NOT] PRESERVE] [COMMENT 'comment'] [ENABLE | DISABLE] [DO sql_statement]
1)一時停止イベント
1
ALTER
EVENT e_test DISABLE;
2)オープンイベント
1
ALTER
EVENT e_test ENABLE;
3)毎日のクリアtest表を5日間のクリアに変更:
1
ALTER
EVENT e_test
2
ON
SCHEDULE EVERY 5
DAY
;
四、削除イベント(DROP EVENT)
文法は簡単です.以下に示します.
1
DROP
EVENT [IF EXISTS] event_name
たとえば、前に作成したe_を削除します.testイベント
1
DROP
EVENT e_test;
もちろんこのイベントが存在することが前提ですが、そうでないとERROR 1513(HY 000):Unknown eventエラーが発生するので、IF EXISTSを加えたほうがいいです
DROP EVENT IF EXISTS e_test;
五、続き
この特性は確かに非常に有用であり、データテーブルをタイミング的に空にしたり、サーバからプライマリ・スレーブを監視したり、データをまとめたりして、毎秒まで正確にすることができ、リアルタイム性も保障されます.SQL文のスケジューリングに加えて、MYSQLのスケジューラはストレージ・プロシージャをスケジューリングすることもできます.
しかし、2つのイベントが同じオブジェクトに対して競合する場合、この状況は私が理解している問題なのか、それとも確かにそうなのか、例えば毎秒挿入とタイミング削除が競合する.