Mysql事件不起作用

时间:2013-05-27 07:02:20

标签: mysql mysql-event mysql-routines

我已经通过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

感谢。

9 个答案:

答案 0 :(得分:106)

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

 SET GLOBAL event_scheduler = ON;

运行它。

答案 1 :(得分:5)

对于那些想知道如何在启动时默认启用它的人,将以下内容添加到配置文件中(my.ini,my.cnf):

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

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

SET GLOBAL event_scheduler = ON;

这样,它将为当前进程运行,如果服务器重新启动,它仍然可以运行。

请注意,如果event_scheduler设置为禁用,则此功能不起作用。在这种情况下,唯一的选择是重新启动服务。

答案 2 :(得分:4)

验证event_scheduler是否为On - 执行以下命令:

SHOW PROCESSLIST;

它会输出一个表/条目,您必须查找用户 event_scheduler命令 Daemon的条目:

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命令验证是否已正确执行,如上所述。

答案 3 :(得分:4)

如果您希望每次mysql服务器重新启动时event_scheduler都自动启动,请在[mysqld]my.ini文件的my.cnf部分下找到/etc/mysql部分1}}你应该放置

[mysqld]

# turning on event_scheduler  
event_scheduler=ON

重启mysql以检查它是否正在运行(在命令行终端!)

sudo service mysql restart

然后检查您的进程列表

SHOW PROCESSLIST

您可以通过查看上次运行时检查您的活动是否正在运行

SELECT * FROM INFORMATION_SCHEMA.events

答案 4 :(得分:2)

临时

SET GLOBAL event_scheduler = ON;

如果event_scheduler被明确禁用,将无法正常工作,请参见下面的方法

永久(需要重新启动)

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

[mysqld]
event_scheduler = ON

注意:

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

  • 关闭(或 0 )(默认)
  • 打开(或 1
  • 已禁用:您不能使用临时启用,只能通过配置文件更改状态并重新启动服务器

警告:关键字 ON / OFF 优于其数值等效项。 实际上, Mysql Workbench 无法识别配置event_scheduler=1,它在 Options File 部分中显示为 OFF 在Ubuntu中使用Mysql Workbench 8.0.17和Mysql Server 5.7.27进行了测试

  

尽管 ON OFF 具有数值等效项,但该值   始终通过SELECT或SHOW VARIABLES为event_scheduler显示   关闭打开已禁用之一。 已禁用没有数字   当量。因此,通常首选 ON OFF   设置此变量时, 1 0

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

答案 5 :(得分:0)

我想加入这个帖子。我将我的数据库转储到另一台服务器,因此我的事件的定义者没有为用户定义这样的授权。我用

更新了我的定义器
ALTER DEFINER='root'@'localhost' EVENT event.name COMMENT '';

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

答案 6 :(得分:0)

请务必在“ DO BEGIN ”或“ DO ”之后添加“提交”。在那之后为我工作。

答案 7 :(得分:0)

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

const string topicName = "rightangle";
const string subscriptionName = "AllMessages";
const string sub1Name = "Filtered1";
const string sub2Name = "Filtered2";

NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

if (!namespaceManager.SubscriptionExists(topicName, subscriptionName))
{
    namespaceManager.CreateSubscription(topicName, subscriptionName);
}
if (namespaceManager.SubscriptionExists(topicName, sub1Name))
{
    Console.WriteLine("Deleting subscription {0}", sub1Name);
    namespaceManager.DeleteSubscription(topicName, sub1Name);
}
Console.WriteLine("Creating subscription {0}", sub1Name);
namespaceManager.CreateSubscription(topicName, sub1Name, new SqlFilter("From LIKE '%Smith'"));

if (namespaceManager.SubscriptionExists(topicName, sub2Name))
{
    Console.WriteLine("Deleting subscription {0}", sub2Name);
    namespaceManager.DeleteSubscription(topicName, sub2Name);
}
Console.WriteLine("Creating subscription {0}", sub2Name);
namespaceManager.CreateSubscription(topicName, sub2Name, new SqlFilter("sys.Label='important'"));

var options = new OnMessageOptions();

var subClient =                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionName);
subClient.OnMessage(m => MessageReceived(subscriptionName, m), options);

var subClient1 =                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName, sub1Name);

subClient1.OnMessage(m => MessageReceived(sub1Name, m), options);

var subClient2 =                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName, sub2Name);

subClient2.OnMessage(m => MessageReceived(sub2Name, m), options);

private static void MessageReceived(string subscriptionName, BrokeredMessage message)
{
   Console.WriteLine("{0} '{1}' Label: '{2}' From: '{3}'", subscriptionName,
            message.GetBody<string>(),
            message.Label,
            message.Properties["From"]);

}

然后

 SET GLOBAL event_scheduler = OFF;

使其实际上将调度程序带入&#34;等待激活&#34; -state。

答案 8 :(得分:-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 ;