您的位置:首页 > 数据库 > MySQL

Mysql 作业(Scheduler)

2016-06-29 19:01 579 查看

介绍

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

语法

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个小时执行一次命令
[code]EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
[/code]

注意: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


[b]创建作业 [/b]

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;


[b]启用禁用作业[/b]

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


[b]删除作业[/b]

drop event schema.eventname


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

[b]总结[/b]

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

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

备注:

作者:pursuer.chen

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

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

《欢迎交流讨论》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: