zoukankan      html  css  js  c++  java
  • MySQL事件调度器Event Scheduler

    我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务。

    在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现。

    在mysql5.1及其之后的版本号添加了计划任务的功能(mysql事件调度器Event Scheduler)。
        事件调度器是定时触发运行的。在这个角度上也能够称作是"暂时的触发器"。

    触发器仅仅是针对某个表产生的事件运行一些语句。而事件调度器则是在某一个(间 隔)时间运行一些语句。事件是由一个特定的线程来管理的,也就是所谓的"事件调度器"。

    启用事件调度器后。拥有 SUPER 权限的账户运行 SHOW PROCESSLIST 就能够看到这个线程了。
        一、事件调度器event_scheduler的开启:
        mysqlserver时间调度器的开启是由一个名叫 event_scheduler的全局变量控制的,这个变量默觉得OFF或者是0
        查看是否开启:
        
    mysql> SHOW GLOBAL VARIABLES LIKE 'event%'; //OFF 关闭;ON 开启;
        mysql> SELECT @@event_scheduler; //0 关闭;1 开启。
        要使用事件调度器必须先开启event_scheduler。开启的方法例如以下:
        1、
    SET GLOBAL event_scheduler = ON
        2、SET GLOBAL event_scheduler = 1;
        3、
    SET @@global.event_scheduler = ON;
        4、SET @@global.event_scheduler = 1; 
        二、事件调度器event_scheduler的语法:
        事件调度器event_scheduler的语法主要包含创建。改动。删除。新建一个event后。假设还未删除,我们能够在mysql的information_schema下的EVENTS表中查到该event。
       1、创建event(CREATE EVENT
       语法:CREATE EVENT [IF NOT EXISTS] event_name 
             ON SCHEDULE schedule 
             [ON COMPLETION [NOT] PRESERVE] 
             [ENABLE | DISABLE] 
             [COMMENT 'comment'] 
             DO sql_statement
       说明:event_name :创建的event名字(唯一确定的)。
             ON SCHEDULE:计划任务
             schedule: 决定event的运行时间和频率(注意时间一定要是将来的时间。过去的时间会出错)。有两种形式 AT和EVERY
                       语法:AT timestamp [+ INTERVAL interval] | EVERY interval [STARTS timestamp] [ENDStimestamp
                       interval
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}(详细说明请參考手冊);
             [ON COMPLETION [NOT] PRESERVE]: 可选项。默认是ON COMPLETION NOT PRESERVE 即计划任务运行完成后自己主动drop该事件;ON COMPLETION  PRESERVE则不会drop掉 。
             [COMMENT 'comment'] :可选项,comment 用来描写叙述event;相当凝视,最大长度64个字节
             [ENABLE | DISABLE] :设定event的状态,默认ENABLE:表示系统尝试运行这个事件,DISABLE:关闭该事情。能够用alter改动
             DO sql_statement: 须要运行的sql语句(能够是复合语句)。
                               注意使用复用语句的时候记得使用分隔符(例3);并且sql语句是由限制,这样的限制跟函数fuction和触发器  trigger中的sql语句限制是一样的。详细是指:LOCK TABLES; UNLOCK TABLES;CREATE EVENT(#bug 18896);ALTER EVENT(#bug 18896);LOAD DATA;CREATE EVENT 是不可预处理的。CREATE EVENT在存储过程中使用时合法的;CREATE EVENT不能够再嵌入式的embedded mysql数据中使用。


       样例:
        例1、CREATE EVENT myevent 
        ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR 
        DO 
           UPDATE myschema.mytable SET mycol = mycol + 1;(从创建開始一小时后运行1次该语句)

        例2、CREATE EVENT e_hourly 
        ON SCHEDULE EVERY 1 HOUR 
        COMMENT 'Clears out sessions table each hour.' 
        DO 
           DELETE FROM site_activity.sessions; (每隔一小时删除session表)
        例3: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 ; 
        2、改动event(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
        说明:语句中的ON SCHEDULEON COMPLETIONCOMMENTENABLE / DISABLE, and DO 与CREATE EVENT中的全然一致
        注意:改动event只对已经存在的event起作用
        样例: 
        1、ALTER EVENT no_such_event
           ON SCHEDULE 
     
    everu '2:3' DAY_HOUR (result:ERROR 1517 (HY000): Unknown event 'no_such_event' )
        2、先创建一个event:
           CREATE EVENT myevent 
           ON SCHEDULE EVERY 6 HOUR 
           COMMENT 'A sample comment.' 
           DO 
              UPDATE myschema.mytable SET mycol = mycol + 1; 
          改动1:
          ALTER EVENT myevent 
          ON SCHEDULE EVERY 12 HOUR 
          STARTS CURRENT_TIMESTAMP + 4 HOUR; (将原来的6小时运行一次,改动成4小时后每12小时运行一次)
          改动2:
          ALTER EVENT myevent DISABLE; (将默认的ENABLE改动为 DISABLE)
          2、改动event(ALTER EVENT
         语法:

          DROP EVENT [IF EXISTS] event_name


    原文链接:http://blog.163.com/wumingli456@126/blog/static/28896414201082732227944/

  • 相关阅读:
    通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
    Java注释@interface的用法
    java的一段对象数据类型映射的代码
    Google Protocol Buffer 的使用和原理
    MyISAM 和 InnoDB 讲解
    一个PHP写的简单webservice服务端+客户端
    提高php运行效率的50个技巧
    剑指Offer:二叉搜索树的后序遍历序列【33】
    剑指Offer:链表中环的入口节点【23】
    剑指Offer:删除链表的节点【18】
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7072580.html
Copyright © 2011-2022 走看看