跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

phpEnv MySQL定时执行SQL语句 phpEnv数据库事件调度器开启

MySQL事件调度器默认关闭,需在phpEnv的my.ini中[mysqld]段添加event_scheduler=ON并重启MySQL服务,同时授予用户EVENT权限,创建事件时须显式指定ENABLE且注意NOW()仅在定义时计算一次。 php Env 中 MySQL 事件调度器默认是关闭的 MySQL 的
EVENT
功能(事件调度器)在 phpEnv 默认安装后处于禁用状态,即使你创建了事件,它也不会自动执行。这不是配置文件写错了,而是 MySQL 实例启动时根本没加载调度线程。 验证方式很简单,在 phpMyAdmin 或命令行执行:
SHOW VARIABLES LIKE 'event_scheduler';
如果返回
OFF
,那就确认未开启。 修改
my.ini
(phpEnv 的 MySQL 配置文件通常位于
phpEnv\MySQL\my.ini
),在
[mysqld]
段落下添加一行:
event_scheduler = ON
保存后必须重启 MySQL 服务(不是重启 phpEnv 整体,只重启 MySQL)——仅靠重载配置不生效 重启后再次执行
SELECT @@event_scheduler;
,返回
ON
才算真正启用 创建定时 SQL 事件前要确认用户权限 即使调度器开了,普通数据库用户(比如 phpMyAdmin 登录用的
root@localhost
)也可能缺少
EVENT
权限,导致
CREATE EVENT
报错:
ERROR 1227 (42501): Access denied; you need (at least one of) the EVENT privilege(s) for this operation
用管理员账号(如 root)登录 MySQL,执行:
GRANT EVENT ON *.* TO 'your_user'@'localhost';
别漏掉
FLUSH PRIVILEGES;
,否则权限不即时生效 注意:phpEnv 默认的
root
用户可能没有密码,但 host 必须匹配(例如
'root'@'127.0.0.1'
和
'root'@'localhost'
是两个不同用户) 事件语法里的时间单位和 NOW() 行为容易踩坑 MySQL 事件的
AT
/
EVERY
时间表达式对函数支持有限,
NOW()
在定义时只计算一次(创建时刻),不是每次触发都刷新,这点和存储过程逻辑完全不同。 错误写法:
CREATE EVENT e_daily_backup ON SCHEDULE EVERY 1 DAY STARTS NOW() DO ...
→ 这里的
NOW()
只取创建那一刻的时间,后续每天不会“对齐零点” 正确做法:显式指定起始时间,例如
STARTS '2024-01-01 02:00:00'
,或用
DATE_ADD(NOW(), INTERVAL 1 HOUR)
做相对偏移(但依然只算一次) 如果想每天凌晨 2 点执行,应写:
EVERY 1 DAY STARTS '2024-01-01 02:00:00'
,并确保服务器时间准确(phpEnv 依赖 Windows 系统时间) 事件日志和调试只能靠手动查表或加记录 MySQL 事件没有内置日志开关,失败也不会报错到错误日志(除非 SQL 本身引发严重异常),静默失败是常态。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ PHP免费学习笔记(深入) ”; 最简单验证方式:在事件 SQL 里插入一条记录到日志表,例如:
INSERT INTO event_log VALUES (NOW(), 'backup_ran');
检查事件状态:
SELECT * FROM mysql.event;
(注意:phpEnv 的 MySQL 版本若低于 8.0,该表在
information_schema
下) 查看是否被禁用:
SELECT db, name, status FROM mysql.event WHERE status = 'DISABLED';
—— 有时事件会因上次执行出错被自动禁用 事件调度器本身不处理事务回滚,如果事件内多条 SQL 中间出错,前面成功的不会自动撤回,得自己用
BEGIN...EXIT HANDLER
包裹。

相关文章