在 MySQL 中,可以通过 事件(Event) 来实现定时任务功能,类似于操作系统的定时任务(如 Linux 的 crontab)。事件可以根据设定的时间规则自动执行 SQL 语句或存储过程,适用于定期数据清理、统计数据更新、备份等场景。
首先需要确保 MySQL 的事件调度器(Event Scheduler)处于开启状态,这是执行定时任务的前提:
-
查看当前状态:
SHOW VARIABLES LIKE 'event_scheduler';
若值为 ON
表示已开启,OFF
表示未开启。
-
开启调度器(临时生效,重启 MySQL 后失效):
SET GLOBAL event_scheduler = ON;
-
永久开启(推荐):在 MySQL 配置文件(my.cnf
或 my.ini
)中添加以下配置,重启 MySQL 后生效:
基本语法:
CREATE EVENT [IF NOT EXISTS] 事件名
ON SCHEDULE 时间规则
DO
执行的SQL语句或存储过程;
-
一次性执行:
-
周期性执行:
EVERY 时间间隔
[STARTS '开始时间']
[ENDS '结束时间']
时间间隔支持:YEAR
(年)、MONTH
(月)、DAY
(日)、HOUR
(时)、MINUTE
(分)、SECOND
(秒)。
CREATE EVENT IF NOT EXISTS clear_old_logs
ON SCHEDULE EVERY 1 DAY
STARTS '2023-10-01 02:00:00'
DO
DELETE FROM system_log
WHERE create_time < DATE_SUB(CURDATE(), INTERVAL 30 DAY);
CREATE EVENT IF NOT EXISTS hourly_statistics
ON SCHEDULE EVERY 1 HOUR
DO
CALL update_statistics();
CREATE EVENT IF NOT EXISTS init_2024_data
ON SCHEDULE AT '2024-01-01 00:00:00'
DO
INSERT INTO yearly_data (year, status) VALUES (2024, 'active');
-
查看所有事件:
-
修改事件:
ALTER EVENT 事件名
ON SCHEDULE 新的时间规则
DO 新的SQL语句;
(例如:修改执行周期为每天执行)
-
禁用 / 启用事件:
ALTER EVENT 事件名 DISABLE;
ALTER EVENT 事件名 ENABLE;
-
删除事件:
DROP EVENT IF EXISTS 事件名;
-
权限要求:创建事件需要
EVENT
权限,且对操作的表需要相应的 INSERT/DELETE/UPDATE
权限。
-
事务支持:事件中执行的 SQL 可以包含事务(
BEGIN...COMMIT
),确保操作的原子性。
-
时间精度:MySQL 事件的时间精度为秒级,无法支持毫秒级定时。
-
日志查看:事件执行失败时,可在 MySQL 错误日志(
error.log
)中查看原因。
-
存储过程配合:复杂的定时任务建议封装为存储过程,再通过事件调用,提高可维护性。
通过事件调度器,MySQL 可以自主完成定时任务,无需依赖外部程序,适合数据库内部的自动化操作。