MySQL事件调度器(Event Scheduler)使用指南
MySQL的事件调度器(Event Scheduler)允许在指定时间自动执行SQL操作。本文将介绍如何检查并开启该功能,如何使用CREATE、ALTER和DROP命令管理定时任务,包括设置每日执行、一次性任务及带起止时间的高级调度方案。
开启事件调度器
要查看当前是否已开启事件调度器,可执行如下SQL:
SHOW VARIABLES LIKE 'event_scheduler';
-- 或
SELECT @@event_scheduler;
若显示:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
则可执行以下命令来开启:
SET GLOBAL event_scheduler = ON;
-- 或使用数字 1
SET GLOBAL event_scheduler = 1;
此外,也可以直接在启动命令加上“--event_scheduler=1”,例如:mysqld ... --event_scheduler=1,或者在配置文件 my.ini 或 my.cnf 中的 [mysqld] 段添加 event_scheduler=ON。
创建定时事件 (CREATE EVENT)
首先来看一下它的语法:
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
其中schedule部分支持多种格式:
AT TIMESTAMP [+ INTERVAL INTERVAL]EVERY INTERVAL [STARTS TIMESTAMP] [ENDS 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}
第1步:每秒插入一条记录
演示如何创建一个每秒钟执行一次的事件:
USE test;
CREATE TABLE aaa (timeline TIMESTAMP);
CREATE EVENT e_test_insert
ON SCHEDULE EVERY 1 SECOND
DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);
等待几秒后查询表test.aaa,可见记录成功插入。
第2步:5天后清空数据表
CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
第3步:在特定日期时间执行
例如在2007年7月20日12点整清空表:
CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
DO TRUNCATE TABLE test.aaa;
第4步:每天定时执行
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
DO TRUNCATE TABLE test.aaa;
第5步:延迟启动的周期性任务
5天后开启每天定时清空test表:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
第6步:设置结束时间的任务
每天定时清空test表,5天后停止执行:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
第7步:组合启动与结束时间
5天后开启每天定时清空test表,一个月后停止执行:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE test.aaa;
第8步:一次性任务(执行即终止)
默认情况下周期任务会持续运行。若希望任务只执行一次,完成后终止,可使用 ON COMPLETION NOT PRESERVE:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE
DO TRUNCATE TABLE test.aaa;
注意:[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。 [ENABLE | DISABLE]可设置该事件创建后状态是否开启或关闭,默认为ENABLE。 [COMMENT 'comment']可以给该事件加上注释。
修改事件 (ALTER EVENT)
语法如下:
ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]
第1步:临时关闭事件
ALTER EVENT e_test DISABLE;
第2步:重新开启事件
ALTER EVENT e_test ENABLE;
第3步:调整调度频率
例如将每天清空改为每5天清空:
ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;
删除事件 (DROP EVENT)
删除事件的语法很简单,前提是这个事件存在,否则会产生 ERROR 1513 (HY000): Unknown event 错误,因此最好加上 IF EXISTS:
DROP EVENT IF EXISTS e_test;
以上就是MySQL事件调度器的详细内容,更多关于MySQL定时任务和自动化维护的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













