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

mysql 中定时任务event的创建

2016-02-18 16:26 603 查看
以前一直使用quartz创建定时任务,但是有时候定时任务一多,总感觉在某个时间段内集中进行定时任务会对tomcat造成比较大的压力(对不起,这是我猜的。。。),所以后来就发现mysql 在5.1之后新增了事件调度器(Event Scheduler)。而且如果是定时调用一个存储过程,会比使用quartz简单的多。

①查看event是否开启:





如果是OFF,则代表关闭。

开启事件调度的方法:
func1.执行:SET GLOBAL event_scheduler = 1 ;
或:SET GLOBAL event_scheduler = ON ;
func2.在my.cnf中(windows环境下是my.ini)修改[mysqld]下的配置:--event_scheduler=1。

②创建事件:
语法:
CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMNET 'comment']
DO sql_statement ;

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
其中语法中的'schedule'代表的是要定时执行的时间
schedule:

AT TIMESTAMP [+INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [END TIMESTAMP]

上句中的INTERVAL代表‘间隔’的意思,
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
   WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
   DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
DO后边的语句是要执行的任务,可以是一个sql语句,也可以是存储过程等。

③查看意创建的定时任务:(此时需要root授权)
func1:SELECT * FROM mysql.event ;
func2:SHOW EVENTS ;
func3:SHOW CREATE EVENT event_nam;此时可查看详细的任务内容,如:SHOW CREATE EVENT e_cancel_foodorder ;

④开启定时任务:
ALTER EVENT e_cancel_foodorder ON COMPLETION
PRESERVE ENABLE ;

⑤关闭定时任务:

ALTER EVENT e_cancel_foodorder ON COMPLETION
PRESERVE DISABLE ;(如果将此event执行了关闭后,重启mysql会删除掉该定时任务)

⑥修改定时任务:

ALTER EVENT e_cancel_foodorder ON SCHEDULE EVERY 5 DAY ;(将每天执行修改为5天执行一次)

⑦删除定时任务:

DROP EVENT [IF EXISTS] event_name ;

⑧创建定时任务的示例:
每分钟执行一次:

CREATE EVENT `e_cancel_foodorder`
ON SCHEDULE EVERY 1 MINUTE
DO UPDATE food_order set status=8 WHERE status=2 AND TIMESTAMPDIFF(MINUTE,time2,NOW())>10 ;

EVERY 后面的是时间间隔,可以选 1 second,3 minute,5 hour,9 day,1
month,1 quarter(季度),1 year
每天0点1分定点执行:
CREATE EVENT `e_cancel_foodorder`
ON SCHEDULE EVERY 1 DAY
STARTS '2015-12-29 00:01:00'
DO UPDATE food_order set status=8 WHERE status=2 AND TIMESTAMPDIFF(MINUTE,time2,NOW())>10 ;

从现在开始每隔九天定时执行:


ON 
SCHEDULE EVERY 9 DAY STARTS NOW()


每个月的一号凌晨1 点执行


on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);



  每个季度一号的凌晨1点执行


  on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval
1 hour);



 每年1月1号凌晨1点执行


  on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval
1 hour);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: