注意:MySQL只在5.1以上版本支持计划任务
一、创建计划任务:
语法:
CREATE
[DEFINER = { user | CURRENT_USER }] #计划任务的所有者,一般省略,则为创建者;
#否则需要有相关权限,则可以指定其它用户
EVENT #计划任务关键字
[IF NOT EXISTS] #如果不存在则创建,可以省略;否则如果存在,则报错
event_name #计划任务名称
ON SCHEDULE schedule #调度计划,如每20分钟,在几点开始等,参考下面的schedule详解
[ON COMPLETION [NOT] PRESERVE] #对于执行一次的任务,默认执行完则删除.加此,
#可控制任务结束后计划任务是否删除或保留
[ENABLE | DISABLE | SLAVESIDE_DISABLED] #指示创建的计划任务是否创建即有效(有
#效则立即执行一次),或禁止执行
[COMMENT 'comment'] #关于计划任务的注释,可放入任务的功能简洁
DO sql_statement; #任务体,可以是单条语句,也可以是以BEGIN/END包裹的符合语句
schedule:
AT timestamp [+ INTERVAL interval] #在什么时候开始运行或某时刻之后interval时间
#在运行,用于运行一次的计划任务
| EVERY interval #或者简单的每隔interval时间运行一次
[STARTS timestamp [+ INTERVAL interval]] #STARTS和ENDS配合EVERY关键字,
#指定运行时间段,单独的STARTS指示STARTS以后的时间段
[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}
#quantity是具体数字,指示多少年或几月或几分钟等
二、更改计划任务
语法:
ALTER EVENT
[DEFINER = { user | CURRENT_USER }] #更改缺省用户
event_name
[ON SCHEDULE schedule] #更改调度时间
[RENAME TO new_event_name] #计划任务改名
[ON COMPLETION [NOT] PRESERVE] #更改一次运行结束后的行为
[ENABLE | DISABLE | SLAVESIDE_DISABLED] #更改计划任务状态
[COMMENT 'comment'] #修改注释
[DO sql_statement] #修改计划执行体
三、删除计划任务
语法:
DROP EVENT [IF EXISTS] event_name
四、开启MySQL计划任务功能支持
MySQL中对计划任务的支持是采用线程调度检测计划任务的。要此功能开启计划任务才会执行。查看调度器状态命令如下:
SHOW [FULL] PROCESSLIST\G
如下是没有开启的状态:
mysql> SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
Id: 10
User: root
Host: localhost:4823
db: mysql
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
1 row in set (0.00 sec)
通过如下全局配置的设置来开启或关闭调度器:
SET GLOBAL event_scheduler = ON/OFF/1/0; --开/关
或SET @@global.event_scheduler = ON/OFF/1/0;
五、示例如下:
其中计划任务体内可以是简单语句,也可以调用存储过程
delimiter //
drop event if exists createmonsterevent//
create event createmonsterevent
on schedule every 20 minute
starts CURRENT_TIMESTAMP + INTERVAL 10 minute
ENABLE
COMMENT '刷怪计划任务'
DO
begin
#20分钟
Call createmonster(date_sub(sysdate(),INTERVAL 24 minute),
date_sub(sysdate(),INTERVAL 2 minute));
end;
//
delimiter ;