mysqlのevent

13659 ワード

Mysqlイベントスケジューラ(Event Scheduler)はタイマに似ており、ある時点でSQL文または文ブロック(BEGIN...END)を実行できます.または一定間隔ごとに繰り返し実行します.LinuxのcrontabやWindowsのTask Schedulerに似ています.
一、イベントスケジューラの構成
すべてのイベントはイベントスケジューリングスレッド(event scheduler thread)で実行されます.イベントスケジューラに言及する場合、通常はスレッドを指します.ユーザーがPROSESS権限を持っている場合、SHOW PROSSSLISTコマンドを使用してスレッドとそのステータスを表示できます.
mysql> show processlist;
+-----+-----------------+-----------+------+---------+------+-----------------------------------+------------------+
| Id  | User            | Host      | db   | Command | Time | State                             | Info             |
+-----+-----------------+-----------+------+---------+------+-----------------------------------+------------------+
|   1 | system user     |           |      | Daemon  |    0 | Waiting for event from ndbcluster | NULL             |
|   3 | root            | localhost | test | Query   |    0 | NULL                              | show processlist |
| 203 | event_scheduler | localhost | NULL | Daemon  |    2 | Waiting for next activation       | NULL             |
+-----+-----------------+-----------+------+---------+------+-----------------------------------+------------------+
3 rows in set (0.00 sec)

システム変数event_schedulerは、イベントスケジューラが有効かどうかを決定します.3つの値があります.
OFF:イベントスケジューラを停止します.イベントスケジューリングスレッドは動作を停止し、SHOW PROSCESSLISTの出力にも表示されません.すべてのスケジューリング時間は実行されません.OFFはevent_schedulerのデフォルト値.
イベントスケジューラが停止するとevent_を設定できます.schedulerがONして起動します.
ON:タイムスケジューラを起動します.イベントスケジューリングスレッドが実行され、すべてのスケジューリングイベントが実行されます.このときSHOW PROSCESSLISTコマンドの出力でそのスレッドとその状態を見ることができます.
イベントを設定するschedulerがOFFの場合、スレッドを停止できます.
DISABLED:イベントスケジューラを無効にします.SHOW PROSCESSLISTコマンドの出力にはこのスレッドは表示されません.イベントを設定することもできませんschedulerがONでスレッドを開始します.イベントスケジューラをDISABLEDに設定するには、サーバの起動時に次のオプションを使用します.
--event-scheduler=DISABLED
または、プロファイル(/etc/my.cnf)の[mysqld]セグメントに次の文を追加します.
event_scheduler=DISABLED
サーバの実行時にevent_を設定できませんschedulerはDISABLEDです.サーバの起動時にevent_が設定されている場合schedulerはDISABLEDで、event_を動的に変更することはできません.schedulerの値はONまたはOFFです.
event_schedulerの値もデジタル形式をサポートします:1はONです;0はOFFです.次の4つの文は、イベントスケジューリングスレッドを開始できます.
set global event_scheduler = on
set @@global.event_scheduler = on
set global event_scheduler = 1
set @@global.event_scheduler = 1

同様に、次の4つの文は、時間スケジューリングスレッドを停止することもできます.
SET GLOBAL event_scheduler = OFF
SET @@global.event_scheduler = OFF
SET GLOBAL event_scheduler = 0
SET @@global.event_scheduler = 0

設定時にglobalキーを使用する必要があります.そうしないと、エラーが発生します.
mysql< SET @@event_scheduler = OFF;
ERROR 1229 (HY000): Variable 'event_scheduler' is a GLOBAL variable and should be set with SET GLOBAL

サーバの起動時に--skip-grant-tablesオプションが指定されている場合event_schedulerは自動的にDISABLEDに設定されます.コマンドラインまたはプロファイルの設定が上書きされます.
二、イベント情報
定義されたすべての時間は、次の方法で表示できます.
1.mysqlデータベースのeventテーブルを問い合わせる:
mysql> select * from mysql.event \G
*************************** 1. row ***************************
                  db: test
                name: evt_insert
                body: insert into account values(NULL, 100.00)
             definer: root@localhost
          execute_at: NULL
      interval_value: 10
      interval_field: SECOND
             created: 2013-06-13 14:07:54
            modified: 2013-06-13 14:07:54
       last_executed: 2013-06-13 19:29:44
              starts: 2013-06-13 18:07:54
                ends: NULL
              status: ENABLED
       on_completion: DROP
            sql_mode: 
             comment: 
          originator: 1
           time_zone: SYSTEM
character_set_client: utf8
collation_connection: utf8_general_ci
        db_collation: utf8_general_ci
           body_utf8: insert into account values(NULL, 100.00)
1 row in set (0.01 sec)

2、クエリーinformation_schemaデータベースのeventsテーブル:
mysql> select * from information_schema.events \G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: test
          EVENT_NAME: evt_insert
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: insert into account values(NULL, 100.00)
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 10
      INTERVAL_FIELD: SECOND
            SQL_MODE: 
              STARTS: 2013-06-13 14:07:54
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2013-06-13 14:07:54
        LAST_ALTERED: 2013-06-13 14:07:54
       LAST_EXECUTED: 2013-06-13 15:30:14
       EVENT_COMMENT: 
          ORIGINATOR: 1
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
  DATABASE_COLLATION: utf8_general_ci
1 row in set (0.01 sec)

3、show create eventコマンドを使用してイベント作成情報を表示する
mysql> show create event evt_insert \G
*************************** 1. row ***************************
               Event: evt_insert
            sql_mode: 
           time_zone: SYSTEM
        Create Event: CREATE DEFINER=`root`@`localhost` EVENT `evt_insert` ON SCHEDULE EVERY 10 SECOND STARTS '2013-06-13 14:07:54' ON COMPLETION NOT PRESERVE ENABLE DO insert into account values(NULL, 100.00)
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

4、show eventsコマンドを使用します.構文の形式は次のとおりです.
SHOW EVENTS [{FROM | IN} schema_name] [LIKE 'pattern' | WHERE expr]
データベース内のすべてのイベント、またはpatternに一致するイベントを表示できます.
mysql> show events \G
*************************** 1. row ***************************
                  Db: test
                Name: evt_insert
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: SECOND
              Starts: 2013-06-13 14:07:54
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

三、イベントスケジューラの権限
イベントの作成、変更、削除にはevent権限が必要です.grant文を使用して、次のようなデータベースのevent権限をユーザーに付与できます.
GRANT EVENT ON myschema.* TO jon@ghidora;
ユーザーにすべてのデータベースのevent権限を付与する場合は、次のことができます.
GRANT EVENT ON *.* TO jon@ghidora;
event権限はデータベース・レベルに属するため、権限ユーザー・テーブル・レベルをエラーとして報告することはできません.
mysql> GRANT EVENT ON myschema.mytable TO jon@ghidora; ERROR 1144 (42000): Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used
イベントスケジューラは、イベントの文ブロックを実行するときに、その定義者の権限を使用します.イベントを定義するときにinsert文が使用されますが、定義者にinsert権限がない場合は、イベントの実行時にエラーが発生し、insertが失敗します.
information_の表示schema.eventsテーブルの場合、イベントが存在し、そのステータスはenabledですが、last_executed列はNULL
mysql> SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='e_store_ts' AND EVENT_SCHEMA='myschema'\G
*************************** 1. row ***************************
EVENT_CATALOG: NULL
EVENT_SCHEMA: myschema
EVENT_NAME: e_store_ts
DEFINER: jon@ghidora
EVENT_BODY: SQL
EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP())
EVENT_TYPE: RECURRING
EXECUTE_AT: NULL
INTERVAL_VALUE: 5
INTERVAL_FIELD: SECOND
SQL_MODE: NULL
STARTS: 0000-00-00 00:00:00
ENDS: 0000-00-00 00:00:00
STATUS: ENABLED
ON_COMPLETION: NOT PRESERVE
CREATED: 2006-02-09 22:36:06
LAST_ALTERED: 2006-02-09 22:36:06
LAST_EXECUTED: NULL
EVENT_COMMENT:
1 row in set (0.00 sec)

revoke文クラスを使用して、次のようなユーザーのevent権限を回収します.
REVOKE EVENT ON myschema.* FROM jon@ghidora;
ユーザーのevent権限は回収されますが、ユーザーが定義したイベントは削除されたりdisableされたりしません.ユーザーを削除したり、ユーザーの名前を変更したりすると、ユーザー定義の時間も自動的に削除されないか、定義者を新しいユーザー名に変更します.
ユーザーのevent権限はmysqlに格納されます.使用者とmysql.db 2枚のテーブルのevent_privフィールドです.event_privフィールドの値はYまたはNです.Nがデフォルトです.mysqlは、ユーザがグローバルイベント権限(すなわちgrant event on*.*)を有する場合にのみ使用する.user.event_privフィールドの値はYです.データベース・レベルのevent権限の場合、grant文はmysqlにあります.dbテーブルにレコードを追加しevent_privフィールドをYに設定します.grant文とrevoke文は同じ操作を実行するため、ユーザーは自分で2つのテーブルを手動で変更する必要はありません.
イベントに関連するアクションを表示できる状態変数は5つあります.
Com_create_event:サーバ起動後にcreate event文を実行した回数
Com_alter_event:サーバ起動後にalter event文を実行した回数
Com_drop_event:サーバ起動後にdrop event文を実行した回数
Com_show_create_event:サーバ起動後にshow create event文を実行した回数
Com_show_events:サーバ起動後にshow events文を実行した回数
イベントに関連するすべてのステータス変数は、次の文で表示できます.
SHOW STATUS LIKE '%event%';
mysql> show status like '%event%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| Com_alter_event                      | 0     |
| Com_create_event                     | 1     |
| Com_drop_event                       | 0     |
| Com_show_binlog_events               | 0     |
| Com_show_create_event                | 2     |
| Com_show_events                      | 3     |
| Com_show_relaylog_events             | 0     |
| Ndb_api_event_data_count_injector    | 1     |
| Ndb_api_event_nondata_count_injector | 0     |
| Ndb_api_event_bytes_count_injector   | 204   |
| Ndb_api_event_data_count             | 1     |
| Ndb_api_event_nondata_count          | 0     |
| Ndb_api_event_bytes_count            | 204   |
+--------------------------------------+-------+
13 rows in set (0.00 sec)

四、文法
1、create event文法
CREATE

    [DEFINER = { user | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    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}

最も基本的なcreate eventは3つの部分しか必要ありません.
1.create eventキーワードおよびevent名
2.on schedule句
3.do句
例:
create event evt_insert 
      on schedule every 10 second
      do update myschema.mytable set mycol = mycol + 1;

文の詳細な説明:
definer:イベントのユーザーを説明します.サーバは、イベントを実行するときに、ユーザーを使用して権限をチェックします.デフォルトのユーザーは現在のユーザー、すなわちdefiner=current_です.user.definerが明示されている場合は、次のルールに従う必要があります.
1.super権限がない場合、唯一許可されている値は自分の現在のユーザーであり、他のユーザーに設定できません.
2.super権限がある場合は、任意の存在するユーザーを指定できます.指定したユーザーが存在しない場合、イベントは実行時にエラーを報告します.
if not exists:イベントがすでに存在する場合、作成されず、エラーも報告されません.
on schedule句は、イベントがいつ実行されるか、およびイベントをどのように実行するかを指定します.
1.at timestampは、単一の実行イベントを作成するために使用されます.timestampがイベント実行を実行した時間は、日付とイベントの2つの部分、またはcurrent_などのdatetimeタイプの式を含む必要があります.timestamp.指定した時間が過去の時間である場合、warningが生成されます.
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2006-02-10 23:59:01 |
+---------------------+
1 row in set (0.04 sec)
mysql > CREATE EVENT e_totals

     ->    ON SCHEDULE AT '2006-02-10 23:59:00'
     ->    DO INSERT INTO test.totals VALUES (NOW());

Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql > SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Note
Code: 1588
Message: Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.

これから2時間半後など、将来の間隔を指定する場合は、intervalキーワード:+INTERVAL'2:30'HOUR_を使用します.MINUTE.intervalキーワードは、+INTERVAL 2 HOUR+INTERVAL 30 MINUTEのように組み合わせてもよい.
2.every句は、繰り返し実行されるイベントを作成するために使用されます.毎分1回実行する場合、EVERY 1 MINUTEとすることができます.every句は開始イベントと終了時間を指定でき、STARTSとENDSキーワードで表され、具体的な構文は前述と類似している.例:
EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK.
通常、イベントの有効期限が切れている場合は、すぐに削除されます.on completion preserve句を使用すると、期限切れの時間を保持できます.ON COMPLETION NOT PRESERVEがデフォルトです.
デフォルトでは、イベントは作成されるとすぐに実行されます.このイベントはdisableキーワードで無効にできます.
コメント文は、イベントにコメントを追加するために使用されます.
do句は、イベントが実行する必要がある操作を示すために使用されます.文でもbeginでも...endに含まれる文ブロック.文ブロックにsql文が含まれている場合はdelimiterを変更する必要がある場合があります.文ブロックには、次のような任意の制御構造を含めることができます.
delimiter //
CREATE EVENT e
ON SCHEDULE
    EVERY 5 SECOND
DO
BEGIN
    DECLARE v INTEGER;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
    SET v = 0;
    WHILE v < 5 DO
        INSERT INTO t1 VALUES (0);    
        UPDATE t2 SET s1 = s1 + 1;
        SET v = v + 1;
    END WHILE;
END //
delimiter ;

次のように、文ブロックでストアド・プロシージャを呼び出すこともできます.
CREATE EVENT e_call_myproc
    ON SCHEDULE
    AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
    DO CALL myproc(5, 27);

2、alter event文法
ALTER
    [DEFINER = { user | CURRENT_USER }]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    [DO event_body]

aleveter文はイベントの1つ以上の属性を変更することができ、DEFINER/ON SCHEDULE/ON COMPLETION PRESERVER/ENABLE/COMMENT/DO句の構文はcreate event文と全く同じで、唯一の違いはイベントの名前を変更することができ、RENAME句を使用します.
ALTER EVENT OLDDB.MYEVENT RENAME TO NEWDB.MYEVENT;

3、drop event文法
DROP EVENT [IF EXISTS] event_name
この文は定義されたイベントを削除します.