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

mysql 定时器用法总结、实例、时间实例

2013-12-18 11:37 387 查看


1、创建定时器事件

语法如下:

CREATE EVENT [IF NOT EXISTS] ‘事件名’

ONSCHEDULE schedule

[ONCOMPLETION[NOT] PRESERVE]

[ENABLE | DISABLE]

[COMMENT 'comment']

DO sql_statement

2、修改事件

使用ALTER EVENT来修改事件,具体的ALTER语法如下,与创建事件的语法类似:

ALTEREVENT
event_name

ONSCHEDULE schedule

[RENAME TOnew_event_name]

[ONCOMPLETION[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()

ONCOMPLETIONPRESERVE 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 COMPLETIONPRESERVE ENABLE; -- 开启事件

关闭定时器:

SET GLOBAL event_scheduler = 0; -- 关闭定时器

ALTER EVENT testEvent OFF COMPLETIONPRESERVE DISABLE; -- 关闭事件

总结:键值1或者ON表示开启;0或者OFF表示关闭;

6、
时间设置
实例


ONSCHEDULE 计划任务,有两种设定计划任务的方式:

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、
从现在开始每隔九天定时执行

ONSCHEDULEEVERY9DAY STARTSNOW()


c、
每个月的一号凌晨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 COMPLETIONPRESERVE ENABLE; -- 开启事件

ALTER EVENT testEvent ON COMPLETIONPRESERVE DISABLE; -- 关闭事件

*/

注意:

1、mysql定时器是从mysql5.1开始的,如果你的mysql版本低于5.1,那就不能使用mysql定时器,查询mysql版本的方法:select version()

2、mysql定时器,默认是关闭的。

3、查询自己创建的定时器: SELECT * FROM mysql.event;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: