MySQL事件无法正常工作。

59

我通过phpmyadmin在我的mysql数据库中添加了以下简单的测试事件:

CREATE DEFINER=`root`@`localhost` EVENT `my_event` 
ON SCHEDULE EVERY 1 MINUTE STARTS '2013-05-27 00:00:00' 
ON COMPLETION NOT PRESERVE ENABLE DO 
BEGIN
    UPDATE `test` SET `name`="z";
END

我的开发环境是mac + MAMP Pro。我希望在一分钟内更改名为“z”的“test”表的所有行,但没有成功。

我需要额外做些什么才能让我的事件开始工作?

“SHOW PROCESSLIST”的输出: enter image description here

谢谢。


你能提供查询 SHOW PROCESSLIST; 的结果吗?也许调度程序没有启动。 - Jacopofar
我刚刚将输出添加到我的问题描述中。我没有做任何事情来启动调度程序。请问如何启动它? - Rana
9个回答

142

事件由调度程序运行,该程序默认情况下未启动。 使用SHOW PROCESSLIST可以检查它是否已启动。如果没有启动,请运行命令。


使用SHOW PROCESSLIST可以检查它是否已启动。如果没有启动,请运行命令。
 SET GLOBAL event_scheduler = ON;

运行它。


9
注意:即使实际正在运行,SHOW PROCESSLIST可能无法显示运行的进程 - 在我没有 root 权限的帐户中使用基于 Plesk 的 Web 主机时会出现这种情况。 event_scheduler 正在运行,但它不会出现在列表中。 对我来说,最好使用 select @@event_scheduler; 如果是打开的将返回ON - Pere
@Jac_opo,我按照你的指示操作了,但是没有任何反应。我已经将全局设置为开启并重新启动了服务器,但仍然没有任何反应。如果我的事件需要一个月后才会发生,我该如何测试呢?我尝试通过更改日期来测试,但是没有任何反应。 - Freddy Sidauruk
@Rana,我该如何调试它?我使用phpmyadmin但不起作用,请访问此处http://stackoverflow.com/questions/35400140/auto-add-field-each-user-using-event-nothing-error-and-doesnt-working - Freddy Sidauruk

14

验证事件调度器是否开启 - 执行以下命令:

SHOW PROCESSLIST;

它将输出一个表格/条目,您必须查找具有Userevent_schedulerCommandDaemon的条目:

Id           User         Host      db  Command Time    State            Info
22870   event_scheduler localhost   \N   Daemon  23    Waiting for next activation  \N

或者,您也可以使用以下命令进行验证:

SELECT @@global.event_scheduler;

根据下一节所述,结果应该是ON,否则将其关闭(命令将返回0)。


如果您没有类似上述的条目,则可以使用以下命令启动事件调度程序:

 SET GLOBAL event_scheduler = ON;

完成后,您可以使用如上所述的 SHOW PROCESSLIST 命令验证其是否已正确执行。


13

如果您想让它在启动时默认开启,请将以下内容添加到您的配置文件中(my.ini、my.cnf):

#Event scheduler can be set to 1 (On), 0 (Off), or Disabled
event_scheduler=1

在这种情况下需要重新启动服务,如果想要最小化干扰,请将此添加到配置文件中,然后运行 SQL:

重新启动服务是必需的,如果您希望最小化中断,请将此添加到配置文件中,然后运行 SQL:

SET GLOBAL event_scheduler = ON;

这样,它将在当前进程中运行,如果服务器重新启动,它仍将工作。

请注意,如果事件调度程序被设置为禁用,则此方法无效。在这种情况下,唯一的选择是重新启动服务。


我想补充说明的是,event_scheduler=1 应该放在配置文件的 [mysqld] 部分。 - aggregate1166877
非常重要的是将event_scheduler=1(或=ON)行添加到正确的配置文件中。我将其添加到了my.cnf中,重新启动了MySQL服务,它运行了一段时间,但24小时后,我无法启动MySQL服务,直到我将其删除。原来,如果my.cnf引用mysql.conf.d/mysql.cnf,则最好将该行添加到该配置文件中,并从那里正确地工作。 - ChrisFNZ

12

如果你想要在 MySQL 服务器重新启动时自动启动 event_scheduler,那么你需要在 /etc/mysql 中找到的 my.inimy.cnf 文件中的 [mysqld] 部分下添加以下内容:

event_scheduler=ON
[mysqld]

# turning on event_scheduler  
event_scheduler=ON

重新启动mysql以检查其是否正在运行(在命令行终端中!)

sudo service mysql restart

然后检查您的进程列表

SHOW PROCESSLIST

您可以通过检查事件上次运行的时间来确定它们是否正在运行

SELECT * FROM INFORMATION_SCHEMA.events

1
尽管@Jacopofar的答案有所帮助,但你的答案为我提供了完整的解决方案。谢谢,我会投票支持你的答案。 :) - Nik

8

时间性

SET GLOBAL event_scheduler = ON;

永久性修改(需要重启)

在您的配置文件中(在Ubuntu上是/etc/mysql/mysql.cnf):

如果事件计划程序被明确禁用,则以下方法将无效,请注意。

[mysqld]
event_scheduler = ON

注:

event_scheduler 变量有以下可能的状态:

  • OFF(或0)(默认)
  • ON(或1
  • DISABLED:您无法使用暂时启用,只能通过配置文件并重新启动服务器更改状态

警告:关键字ON / OFF优先于它们的数值等价物。 事实上,Mysql Workbench不识别配置项event_scheduler=1,在选项文件部分显示为OFF已在Ubuntu上测试,使用Mysql Workbench 8.0.17和Mysql Server 5.7.27

虽然ONOFF有数值等价物,但是通过SELECT或SHOW VARIABLES显示的event_scheduler的值始终是OFFONDISABLED之一。 DISABLED没有数值等价物。因此,在设置此变量时通常首选ONOFF而不是10

来源:https://dev.mysql.com/doc/refman/5.7/en/events-configuration.html


1

我刚刚发现,在MariaDB上添加事件(在我的情况下,是第一个事件)后,你需要重新启动事件调度程序。

 SET GLOBAL event_scheduler = OFF;

然后

 SET GLOBAL event_scheduler = ON;

让它真正将调度程序置于“等待激活”状态。


0

请记得在 'DO BEGIN' 或 'DO' 后面加上 'Commit'。这样对我有效。


0

我想在这个帖子中补充一点。我将我的数据库转储到另一个服务器上,结果我的事件定义者没有为用户定义此类授权。我更新了我的定义者:

ALTER DEFINER='root'@'localhost' EVENT event.name COMMENT '';

请确保您的定义者具有正确的权限。


-1

尝试

SET GLOBAL event_scheduler = ON;
DELIMITER $$
CREATE DEFINER=`root`@`db01` EVENT `PRICEALERT_STATUS` 
ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE) 
DO BEGIN
// Your Query
END $$
DELIMITER ;

这样做不起作用,因为事件必须先运行,才能打开该事件调度程序。 - earl3s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接