你的位置:首页 > 数据库

[数据库]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 SECOND2.在当前的时间基础上加上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'
DOINSERT 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 WEEKDOINSERT INTO study.Tevent() VALUES(NOW());

查看数据库中创建的作业

select * from information_schema.events;

启用禁用作业

1.启用ALTER EVENT schema.event_name ENABLE2.禁用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

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

《欢迎交流讨论》