Mysql 作业(Scheduler)

介绍

 作业也叫做事件调度,其实它也就是一个时间触发器;它可以定义某个时间点执行指定的数据库命令操作。

 

 

 语法

CREATE
    [DEFINER = { user | CURRENT_USER }]    ######定义创建人,默认创建事件的用户就是事件的定义人,必须具备super权限才能指定其他用户。
    EVENT                                  ######创建事件
    [IF NOT EXISTS]                        ######删除并判断是否有存在重名的作业
    event_name                             ######作业名
    ON SCHEDULE schedule                   ######ON SCHEDULE是固定语法,schedule定义执行的时间
    [ON COMPLETION [NOT] PRESERVE]         
    [ENABLE | DISABLE | DISABLE ON SLAVE]  ######启用或者禁用或者在从库上禁用
    [COMMENT 'comment']                    ######备注
    DO                                     ######规定语法
event_body; ######操作命令 schedule: AT
timestamp [+ INTERVAL interval] ... ####定义执行的时间,命令在指定的时间执行一次,INTERVAL是在AT timestamp的基础上执行类似DATE_ADD()命令,在指定的时间基础上加上一个时间,其中interval参数有很多具体的时间单位具体参考下面 | EVERY interval ####EVERY是重复执行的命令和AT是冲突的 [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}

注意:AT和EVERY是互斥的操作;AT:只在规定的时间执行一次,EVERY:重复执行。

组合的时间格式只有“年月日时分秒”之间的组合方式,没有week的组合方式

由于Mysql语法非常的灵活,所以它支持很多的时间格式,类似如下:

1.在指定的时间基础上加上2分10秒
AT '2016-06-01 22:00:00' + INTERVAL '2:10' MINUTE_SECOND
等同于
AT '2016-06-01 22:00:00' + INTERVAL 2 MINUTE + INTERVAL 10 SECOND
2.在当前的时间基础上加上3星期2天 AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY
3.指定开始和结束时间,从当前时间加30分钟开始至当前时间加4个星期结束每12个小时执行一次命令
EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK 

 注意:EVERY不支持“+ INTERVAL”格式,例如“+ INTERVAL 2 MINUTE + INTERVAL 10 SECOND”只能用 “ ‘2:10’ MINUTE_SECOND”代替

查看作业功能否启用

show  global variables like '%event_scheduler%';
select @@event_scheduler;

如果没有启用需要修改my.cnf,加入

event_scheduler=1

创建作业 

 1.在指定的时间点执行命令

CREATE EVENT testevent 
ON SCHEDULE AT
'2016-06-27 22:00:00'
COMMENT 'AT TIME '2016-06-27 22:00:00' EXEC INSERT Tevent'
DO INSERT INTO study.Tevent() VALUES(NOW());

2.也支持delimiter定义结束符

delimiter |

CREATE EVENT e_daily
    ON SCHEDULE
      EVERY 1 DAY
    COMMENT 'Saves total number of sessions then clears the table each day'
    DO
      BEGIN
        INSERT INTO site_activity.totals (time, total);
          SELECT CURRENT_TIMESTAMP, COUNT(*) FROM site_activity.sessions;
        DELETE FROM site_activity.sessions;
      END |

delimiter ;

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 ;

4.定义开始和结束时间

CREATE EVENT testevent ON SCHEDULE 
EVERY 12 HOUR 
STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE 
ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
DO
INSERT INTO study.Tevent() VALUES(NOW());

查看数据库中创建的作业

select * from information_schema.events;

启用禁用作业

1.启用
ALTER EVENT schema.event_name ENABLE
2.禁用
ALTER EVENT schema.event_name DISABLE

删除作业

drop event schema.eventname

 

官方文档:http://dev.mysql.com/doc/refman/5.6/en/create-event.html

总结

DO后面的支持通用的Mysql语法操作;所有可以可以执行单个命令、可以执行命令串、也可以类型函数和存储过程执行循环语句、还可以直接调用存储过程等。

注意:每个作业都有它所属的数据库,作业是属于具体的某个数据库的。

 

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

posted @ 2016-06-29 19:01  pursuer.chen  阅读(3343)  评论(0编辑  收藏  举报