MySQL--基础知识点--81.2--EVENT
在 MySQL 中,事件(Event) 是一种内置的定时任务机制,用于在指定时间自动执行预定义的 SQL 语句或存储过程。它类似于操作系统的定时任务(如 cron job
),但完全由 MySQL 数据库管理。
1 事件的核心特性
- 定时执行
- 支持一次性执行(
AT
子句)或周期性执行(EVERY
子句)。
- 支持一次性执行(
- 精确控制
- 可按秒、分钟、小时、天、周、月、年等单位定义执行频率。
- 依赖事件调度器
- 需确保 MySQL 的事件调度器已开启(默认可能关闭)。
2 如何创建事件
基本语法:
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
DO
-- 要执行的 SQL 语句或存储过程
2.1 示例 1:每天凌晨清理过期日志
场景:假设有一个日志表 app_logs
,需每天凌晨 2 点删除 30 天前的日志。
实现代码:
DELIMITER
$$
CREATE EVENT IF NOT EXISTS clean_old_logs
ON SCHEDULE EVERY 1 DAY
STARTS '2025-04-11 02:00:00'
DO
BEGIN
DELETE FROM app_logs
WHERE log_time < NOW() - INTERVAL 30 DAY;
END
$$
DELIMITER ;
关键参数说明:
- EVERY 1 DAY:定义每天执行一次。
- STARTS:指定首次执行时间(若省略,默认立即执行)。
- DO:定义要执行的操作(多语句需用 BEGIN…END 包裹)。
2.2 示例 2:每小时生成统计报表
场景:假设需每小时调用存储过程生成订单统计报表。
实现代码:
CREATE EVENT generate_hourly_report
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP
DO
CALL GenerateOrderReport(); -- 调用存储过程生成报表
说明:
- EVERY 1 HOUR:定义每小时执行一次。
- STARTS CURRENT_TIMESTAMP:立即开始执行,并按小时周期重复。
3 事件管理命令
查看所有事件:
SHOW EVENTS;
启用/禁用事件:
ALTER EVENT clean_old_logs ENABLE; -- 启用
ALTER EVENT clean_old_logs DISABLE; -- 禁用
删除事件:
DROP EVENT IF EXISTS clean_old_logs;
4 注意事项
- 1 事件调度器状态
- 检查是否开启:
SHOW VARIABLES LIKE 'event_scheduler';
- 开启调度器(若未启用):
SET GLOBAL event_scheduler = ON;
- 检查是否开启:
- 2 权限要求
- 用户需具备 EVENT 权限才能创建、修改或删除事件。
- 3 时间精度
- MySQL 事件的最小时间精度为秒级,无法执行毫秒级任务。
- 4 错误处理
- 若事件执行过程中发生错误,默认不会终止后续执行(可通过 ON COMPLETION PRESERVE 调整)。
- 5 资源占用
- 高频事件可能增加数据库负载,需合理设计执行频率和 SQL 逻辑。