mysql event功能可定时执行sql任务,需先启用event_scheduler(默认关闭),再用create event定义调度逻辑,支持every周期、starts/ends时间控制,并需注意权限、错误日志监控及分批处理等生产安全实践。

MySQL 的 EVENT(事件)功能可以实现定时执行 SQL 任务,比如自动清理日志、汇总统计、归档旧数据等。它不依赖外部调度工具(如 Linux cron),直接在数据库内运行,配置集中、便于维护。
启用事件调度器
EVENT 功能默认是关闭的,必须先开启全局调度器:
- 查看当前状态:
SHOW VARIABLES LIKE 'event_scheduler';(返回 OFF / ON / DISABLED) - 临时启用(重启后失效):
SET GLOBAL event_scheduler = ON; - 永久启用:在
my.cnf或my.ini中添加event_scheduler = ON,然后重启 MySQL
注意:DISABLED 表示编译时禁用,无法通过 SET 启用,需重装或换版本。
ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有
创建定时事件的基本语法
一个典型事件包含名称、调度时间、是否启用、以及要执行的 SQL 逻辑:
CREATE EVENT clean_old_logs ON SCHEDULE EVERY 1 DAY STARTS CURRENT_DATE + INTERVAL 1 DAY DO DELETE FROM system_log WHERE create_time < NOW() - INTERVAL 30 DAY;
-
EVERY:支持秒(SECOND)、分(MINUTE)、小时(HOUR)、天(DAY)、周(WEEK)、月(MONTH)、年(YEAR)单位,可组合如
EVERY 2 WEEK -
STARTS / ENDS:指定起止时间,支持表达式(如
CURRENT_TIMESTAMP + INTERVAL 1 HOUR) -
ON COMPLETION PRESERVE:事件执行完后保留(默认行为);加
DROP则自动删除 -
ENABLE / DISABLE:新建事件默认 ENABLE,可用
ALTER EVENT xxx DISABLE;暂停
常见管理与调试技巧
事件运行无声无息,出错不易察觉,需主动监控和干预:
- 查看所有事件:
SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'your_db'; - 查看事件定义:
SHOW CREATE EVENT clean_old_logs; - 手动触发一次(调试用):
ALTER EVENT clean_old_logs ENABLE; -- 确保已启用,再等待调度或调整STARTS时间提前触发 - 错误排查:事件内部 SQL 报错不会中断调度,但会记录到 MySQL 错误日志(需开启 general_log 或 error_log 并留意 warning 级别信息)
- 避免长事务冲突:若事件中含大范围 DELETE/UPDATE,建议加 LIMIT 分批处理,并配合
SLEEP(0.1)减少锁竞争
安全与生产建议
事件在数据库内以 DEFINER 权限运行,默认是创建者账户,权限不足会导致失败:
- 创建时显式指定高权限用户:
CREATE DEFINER='admin'@'localhost' EVENT ... - 避免在事件中使用未加库名前缀的表名,防止跨库误操作
- 敏感操作(如 DROP TABLE)务必加条件判断和注释说明,上线前在测试库完整验证
- 定期检查事件状态:
SELECT EVENT_NAME, STATUS, LAST_EXECUTED, LAST_ALTERED FROM information_schema.EVENTS; - 备份事件定义:导出时
mysqldump --events可包含事件结构(但不导出数据)









