普通用户无法通过SET GLOBAL event_scheduler=ON开启事件调度器,必须由DBA在my.cnf中配置event_scheduler=ON并重启;EVENT权限需按库显式授予(如GRANT EVENT ON app_log.*),且事件须显式ENABLE,运行时依赖DEFINER账户权限。

普通用户无法通过 SET GLOBAL event_scheduler = ON 开启事件调度器,这是硬性权限限制,不是配置遗漏。真正能授予用户的“Event管理权限”,仅指创建、修改、删除事件的能力,不包括控制全局调度器开关。
EVENT 权限必须显式按库授予,不能用 ON *.*
MySQL 8.0 默认严格校验通配符权限,GRANT EVENT ON *.* 对普通用户基本无效——即使执行成功,后续 CREATE EVENT 仍会报错 ERROR 1227。
- 先确保目标数据库存在:
CREATE DATABASE IF NOT EXISTS app_log - 再授予权限:
GRANT EVENT ON app_log.* TO 'app_user'@'localhost' - 如果事件体要写数据,还得补 DML 权限:
GRANT INSERT, SELECT ON app_log.* TO 'app_user'@'localhost' - 最后刷新:
FLUSH PRIVILEGES - 验证是否生效:
SELECT event_priv FROM mysql.db WHERE Db = 'app_log' AND User = 'app_user',返回Y才算成功
event_scheduler 必须由 DBA 在配置文件中开启
用户没有权限动态开启调度器,SET GLOBAL event_scheduler = ON 需要 SYSTEM_VARIABLES_ADMIN(或旧版 SUPER),这属于高危权限,绝不应授予普通用户。
- DBA 必须在
my.cnf的[mysqld]段下添加:event_scheduler = ON - 然后重启 MySQL 服务,否则所有事件都处于静默挂起状态
- 检查是否真正启用:
SHOW VARIABLES LIKE 'event_scheduler',值必须为ON(不是DISABLED或OFF) - 主从环境只应在主库开启,从库保持
OFF
CREATE EVENT 必须带 ENABLE,否则默认不执行
即使调度器已开、权限已给,CREATE EVENT 默认生成的是 DISABLED 状态,SHOW EVENTS 中显示为 DISABLED,Last_executed 始终为 NULL。
- 显式启用:
CREATE EVENT ... ENABLE DO ... - 或创建后手动启用:
ALTER EVENT my_event ENABLE - 事件运行时使用
DEFINER账户的权限,不是创建者的权限;若未指定,DEFINER = CURRENT_USER是安全默认值 - 如果事件内含
INSERT等操作,DEFINER账户必须有对应表的 DML 权限,否则静默失败(错误日志里只记INSERT command denied)
最容易被忽略的是:EVENT 权限和事件能否真正执行是两层隔离。你可能已经正确授了权、开了调度器、建了事件,但只要 DEFINER 账户缺失某张表的 UPDATE 权限,或者事件体里用了未授权的数据库名,它就完全不报错也不执行——只能靠查错误日志定位。


















