MySQL 5.1 引入的时间调度器可以作为定时任务调度器,取代系统的cron调度,调度时间可以精确到秒,实时性好。
开启事件调度器
首先查看是否开启了事件调度器: show variables like "event_scheduler";
或 SELECT @@event_scheduler;
。
开启事件调度器: SET GLOBAL event_scheduler = ON;
,这个命令需要具有 SUPER 权限才能执行,可以用 root 用户来执行,说明是作用在整个数据库服务上的,而不单是某个数据库实例。
查看事件的执行情况
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;