我正在运行与Windowsmysql 5.1.41
捆绑在一起的。xampp
问题是事件不会自动运行,即使event scheduler
是ON
. 我有一个名为ta_table
using的表innodb engine
,它有 4 个字段,其中一个字段ti_time
的timestamp
类型默认值为current timestamp
. 该字段ti_time
被赋予插入行的时间戳值。现在我想从表中删除所有 2 小时前的行,ta_table
所以我创建了一个事件,该事件看起来像这样
CREATE EVENT ev ON SCHEDULE EVERY 1 MINUTE STARTS 2011-07-17 14:54:52 ENABLE
DO
begin
delete from ta_table where timestampdiff(minute,ti_time,now())>120;
end
现在这个事件应该删除任何ti_time
字段大于 2 小时(120 分钟)的行。当我执行这个查询
delete from ta_table where timestampdiff(minute,ti_time,now())>120;
有用。它会删除超过 2 小时的行。这意味着我的查询是正确的,但事件没有运行。我的事件调度程序正在运行,我确认show processlist
它显示了 2 个进程根和事件调度程序。state
事件调度程序的是waiting for next activation
。当我运行这个查询时
SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE event_name = 'ev'
它给出的结果为
status = enabled
last executed=2011-07-18 02:36:38
但是当我看到表格时ta_table
,记录没有被删除?这有什么问题?
编辑:
根据 RolandoMySQLDBA 的建议,我将 mysql 5.1.14 升级到 mysql 5.5,但事件仍然失败
我对事件调度程序问题的错误列表进行了一些真正的挖掘。
似乎事件调度程序的某个时间计算是不可移植的。此错误已从 MySQL 5.1.48(2010 年 6 月 2 日修复)开始修复。
过去存在一个关于 SHOW EVENTS 没有从正确的数据库中获取事件的问题。此错误已从 MySQL 5.1.57(2011 年 5 月 5 日修复)开始修复。
最新的调度程序错误已于 2011 年 7 月 5 日在 MySQL 5.1.58 中修复
您正在使用 MySQL 5.1.41。您可能想要升级到 MySQL 5.1 的最新版本,即 5.1.58。截至今天,不存在调度程序错误。
警告
另一方面,我会将 SQL 查询更改为不仅减少工作量
而不是您的 DELETE 查询:
重组它如下:
您的 DELETE 将针对表中的每一行进行计算。这个新的 DELETE 在将 ti_time 与时间值(now() - 间隔 2 小时)进行比较时停止,而不是在每一行上计算 timestampdiff。
确保 ti_time 已编入索引。如果没有,请执行以下操作:
假设表是 MyISAM,您可能还希望每月定期收缩表,如下所示:
我希望这个信息帮助 !!!
更新 2011-07-19 08:00 EDT
从我上次的聊天室会话 lovesh 开始,这是我在运行 MySQL 5.5.12 的 PC 上运行以创建事件的示例:
当 ta_table 是 MyISAM 时,这对我有用。它只是使用 InnoDB 继续运行。这可能是症结所在。
我相信您的事件必须使用完全限定的模式和表名来定义:
参考:http ://www.cs.duke.edu/csl/docs/mysql-refman/events.html#events-limitations-restrictions
所以应该重新定义您在 EVENT 中的查询(使用 Rolando 改进的删除查询):