1、创建定时器事件
语法如下:
CREATE EVENT [IF NOT EXISTS] ‘事件名’
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement
使用ALTER EVENT来修改事件,具体的ALTER语法如下,与创建事件的语法类似:
ALTEREVENT event_name
ON SCHEDULE schedule
[RENAME TOnew_event_name]
[ON COMPLETION [NOT]PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
3、关于事件计划的权限:
单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。(FLUSH PRIVILEGES;)
当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。
SELECT HOST,USER,Event_priv FROM mysql.user;
(Figure1:user表的Event_priv权限)
获取当前登陆的用户和数据库:SELECT CURRENT_USER(), SCHEMA();
从Figure1可以知道bfsql@%是没有Event_priv权限的,在该用户下创建事件的时候会出现下面的错误:
Error Code: 1044
Access denied for user 'bfsql'@'%' to database 'blog'
如果出现上面的错误,执行下面的SQL就可以给bfsql@%赋予创建Event的权限:
UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='bfsql';
如果你这个时候再次执行创建Event的SQL,还是会出现上面的错误,因为你需要执行:
FLUSH PRIVILEGES;最后,你可以通过SHOW GRANTS FOR 'bfsql'@'%';查看所有权限;
4、实例
CREATE
EVENT testEvent
ON SCHEDULE EVERY 10 SECOND STARTS now()
ON COMPLETION PRESERVE ENABLE
DO BEGIN
-- 现在执行每隔10秒执行一次
INSERT INTO ad_db.fh_test_timer ( VALUE) VALUES (now()); -- 循环要干的事情 可以调用其他存储过程 如:call test();
END
注意:如果调用的是,存储过程,则do后面的begin end不要。
5、开启、关闭定时器
开启(执行sql语句如下):
SET GLOBAL event_scheduler = 1; -- 启动定时器
ALTER EVENT testEvent ON COMPLETION PRESERVE ENABLE; -- 开启事件
关闭定时器:
SET GLOBAL event_scheduler = 0; -- 关闭定时器
ALTER EVENT testEvent OFF COMPLETION PRESERVE DISABLE; -- 关闭事件
总结:键值1或者ON表示开启;0或者OFF表示关闭;
6、时间设置
实例
ON SCHEDULE 计划任务,有两种设定计划任务的方式:
1. AT 时间戳,用来完成单次的计划任务。
2. EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务。
在两种计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。
在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式,可以选 1 second,3 minute,5 hour,9 day,1month,1 quarter(季度),1 year
,
分别对应多少秒、分钟、小时、天、月、季度、年
重复计划如:
a、从2013年12月18号0点开始,每天运行一次
ON
SCHEDULE EVERY 1
DAY
STARTS
'2013-12-18 00:00:00'
b、
从现在开始每隔九天定时执行
ON SCHEDULEEVERY9 DAY STARTSNOW()
;
每个月的一号凌晨1 点执行
on schedule every1 monthstartsdate_add(date_add(date_sub(curdate(),interval day(curdate())-1day),interval 1 month),interval 1 hour);
D、
每个季度一号的凌晨1点执行
on schedule every1 quarterstartsdate_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval1 quarter),interval 1 hour);
F、
每年1月1号凌晨1点执行
on schedule every1 yearstartsdate_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval1 quarter),interval 1 hour);
7、其他
其他命令:
/*
SHOW VARIABLES LIKE '%sche%'; -- 查看定时器状态
SET GLOBAL event_scheduler = 1; -- 启动定时器
SET GLOBAL event_scheduler = 0; -- 停止定时器
ALTER EVENT testEvent ON COMPLETION PRESERVE ENABLE; -- 开启事件
ALTER EVENT testEvent ON COMPLETION PRESERVE DISABLE; -- 关闭事件
*/
注意:
1、mysql定时器是从mysql5.1开始的,如果你的mysql版本低于5.1,那就不能使用mysql定时器,查询mysql版本的方法:select version()
2、mysql定时器,默认是关闭的。
3、查询自己创建的定时器: SELECT * FROM mysql.event;