MySQL 事件调度器 定时调度

MySQL 5.1 引入的时间调度器可以作为定时任务调度器,取代系统的cron调度,调度时间可以精确到秒,实时性好。

开启事件调度器

首先查看是否开启了事件调度器: show variables like "event_scheduler";SELECT @@event_scheduler;

开启事件调度器: SET GLOBAL event_scheduler = ON;,这个命令需要具有 SUPER 权限才能执行,可以用 root 用户来执行,说明是作用在整个数据库服务上的,而不单是某个数据库实例。

MySQL服务器默认是没有开启事件调度器的,这样上述通过命令开启的在MySQL服务器重启后会失效,可以在配置文件里默认开启,在 [mysqld] 下添加配置: event_scheduler=ON 默认开启。

查看事件的执行情况

SELECT * FROM information_schema.EVENTS;

创建事件

语法:

CREATE  EVENT  [IF  NOT EXISTS]  event_name
     ON  SCHEDULE  schedule
     [ON  COMPLETION  [NOT]  PRESERVE]
     -- 执行完后是否保留事件,默认为NOT PRESERVE,也就是非周期性任务执行完后删除。
     [ENABLE  |  DISABLE]                 -- 开启或关闭事件
     [COMMENT  'comment']                 --  事件说明
     DO   sql_statement;                  --  要执行的 sql 语句

schedule:
     AT  TIMESTAMP  [+INTERVAL  INTERVAL_VAL]
--  AT  用于在指定时间点执行一次。

     EVERY  INTERVAL  [STARTS  TIMESTAMP]  [END  TIMESTAMP]
--  EVERY  用于每隔指定的时间重复执行。
--  如果没有指定开始时间和结束时间,那么默认的开始时间就是当前结束时间,没有结束时间。


INTERVAL_VAL:
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 event_name
     [ON SCHEDULE schedule]            --  设定调度时间
     [RENAME TO new_event_name]        --  重命名为另一个名字
     [ON COMPLETION [NOT] PRESERVE]    -- 执行完后是否保留事件,默认不保留
     [COMMENT 'comment']               --  事件说明
     [ENABLE | DISABLE]                -- 开启或关闭事件
     [DO sql_statement]                --  要执行的 sql 语句

删除事件

DROP   EVENT  eventName;

DROP   EVENT  IF  EXISTS  eventName;

代码示例

--  创建一个测试表
CREATE  TABLE aaa  (timeline  TIMESTAMP)


--  每隔一秒钟插入一条记录,这里没有指定时间范围,就从当前时间开始一直重复调度。
CREATE  EVENT  e_test
     ON  SCHEDULE  EVERY  1  SECOND
     DO  INSERT  INTO  aaa  VALUES(CURRENT_TIMESTAMP);

--   创建事件但不调度执行
CREATE  EVENT  e_test
     ON  SCHEDULE  EVERY  1  SECOND
     DISABLE
     COMMENT  'not enabled, just for later use .'
     DO  INSERT  INTO  aaa  VALUES(CURRENT_TIMESTAMP);


--   修改事件的调度间隔,并使能被调度。
ALTER  EVENT  e_test
     ON  SCHEDULE  EVERY  10  SECOND
     ENABLE;


--   在指定时间点执行一次
CREATE  EVENT  e_test
     ON  SCHEDULE  AT  TIMESTAMP  '2014-01-27 23:59:50'
     DO  TRUNCATE  TABLE  aaa;


--   在指定时间点执行一次,执行完后保留事件。
CREATE  EVENT  e_test
     ON  SCHEDULE  AT  TIMESTAMP  '2014-01-27 23:59:50'
     ON  COMPLETION   PRESERVE
     DO  TRUNCATE  TABLE  aaa;


--  从某个时间范围内周期性地执行任务
CREATE  EVENT  e_test
     ON  SCHEDULE  EVERY  1  DAY
     STARTS  TIMESTAMP  '2014-01-27 23:59:50'
     ENDS  TIMESTAMP  '2014-02-27 23:59:50'
     DO  TRUNCATE  TABLE  aaa;


--   删除事件
DROP   EVENT  e_test;


--   如果存在,删除事件。
DROP   EVENT  IF  EXISTS  e_test;

欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据