我已经通过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”的输出:
感谢。
答案 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
变量可以具有以下可能的状态:
警告:关键字 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 ;