MySQL事件调度器(Event Scheduler)使用指南

周予安
周予安
发布时间:2026-10-14 | 3人浏览过
原创

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定时任务和自动化维护的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表