




MySQL事件调度器默认关闭,需通过SET GLOBAL event_scheduler=ON临时启用或在配置文件[mysqld]段添加event_scheduler=ON永久启用,并重启服务;用户还需拥有EVENT权限,创建事件时显式指定ENABLE才能正常执行。
MySQL 事件调度器默认是关闭的,即使安装完成也无法自动运行定时任务。必须显式开启,否则 CREATE EVENT 能执行成功,但事件永远不会触发。
检查当前状态:SELECT @@event_scheduler; —— 返回 OFF 表示未启用
临时启用(重启后失效):SET GLOBAL event_scheduler = ON;
永久启用需修改配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 段落下添加:event_scheduler = ON
my.ini,位置可能在 MySQL 安装目录或 
C:\ProgramData\MySQL\MySQL Server X.X\
sudo systemctl restart mysql(Linux)或服务管理器(Windows)Unknown system variable 'event_scheduler' —— 这说明 MySQL 版本低于 5.1.6,不支持事件调度器用户必须拥有 EVENT 权限才能创建、修改或删除事件。仅 CREATE 或 ALTER 权限不够。
授予权限示例:GRANT EVENT ON *.* TO 'your_user'@'localhost';FLUSH PRIVILEGES;
ON database_name.* 可限制为特定库SQL SECURITY DEFINER)max_connections 和 event_scheduler 共享线程资源;高并发事件可能因连接数耗尽而静默失败ENABLE(否则是 DISABLE 状态)以下事件每 30 秒向测试表插入一行时间戳,用于验证调度器是否工作正常:
CREATE EVENT IF NOT EXISTS test_event ON SCHEDULE EVERY 30 SECOND DO INSERT INTO test_log (created_at) VALUES (NOW());
关键点说明:
test_log 表需提前存在,且至少含一个 DATETIME 或 TIMESTAMP 字段(如 created_at)EVERY 30 SECOND 是最小合法间隔;不能写成 EVERY 1000 MILLISECOND —— MySQL 不支持毫秒级调度SELECT ... INTO 必须有目标变量,不能直接输出)mysql.event 表或错误日志才能发现失败最常遇到的是“事件创建成功但完全没反应”,多数情况不是语法问题,而是环境或配置卡点:
SHOW PROCESSLIST 中看不到 Daemon 类型线程 → 说明 event_scheduler 根本没启动SELECT * FROM information_schema.EVENTS WHERE EVENT_NAME = 'test_event'\G 中 STATUS 是 SLAVESIDE_DISABLED → 可能是主从复制环境下从库禁止事件(需设 event_scheduler = ON 并确保 skip-slave-start 未启用)LAST_EXECUTED 为空,但 STATUS 是 ENABLED → 检查系统时间是否被大幅调整过(MySQL 事件依赖单调递增的时间戳)ON COMPLETION PRESERVE 创建的事件,在到期后仍保留但不再触发 → 需手动 ALTER EVENT ... ENABLE
事件调度器本身不提供日志开关,调试只能靠在事件体中写入日志表,或打开 MySQL 的通用查询日志(不推荐生产环境长期开启)。