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

 

1、创建定时器事件

   语法如下:

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

ON SCHEDULE schedule

[ON COMPLETION [NOT] PRESERVE]

[ENABLE | DISABLE]

[COMMENT 'comment']

DO sql_statement



2、修改事件

使用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;

 mysql 定时器用法总结、实例、时间实例_第1张图片

(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() ;

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  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;

你可能感兴趣的:(数据库)