MySQL 事件不运行

lov*_*esh 4 mysql mysql-5 mysql-5.5 mysql-5.1

我正在运行mysql 5.1.41,它与xamppWindows捆绑在一起。问题是事件不会自动运行,即使event schedulerON. 我有一个名为ta_tableusing的表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
Run Code Online (Sandbox Code Playgroud)

现在此事件应删除ti_time字段大于 2 小时(120 分钟)的任何行。当我执行此查询时

delete from ta_table where timestampdiff(minute,ti_time,now())>120;
Run Code Online (Sandbox Code Playgroud)

有用。它删除超过 2 小时的行。这意味着我的查询是正确的,但事件没有运行。我的事件调度程序正在运行,我确认了show processlist 它,它显示了 2 个进程根和事件调度程序。该state事件调度的是waiting for next activation。当我运行这个查询时

SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE event_name = 'ev'
Run Code Online (Sandbox Code Playgroud)

它给出的结果为

status = enabled
last executed=2011-07-18 02:36:38
Run Code Online (Sandbox Code Playgroud)

但是当我看到表格时ta_table,记录没有被删除?这有什么问题吗?

编辑:

根据 RolandoMySQLDBA 的建议,我将 mysql 5.1.14 升级到 mysql 5.5,但事件仍然失败

Rol*_*DBA 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 from ta_table where timestampdiff(minute,ti_time,now())>120;
Run Code Online (Sandbox Code Playgroud)

将其重组如下:

delete from ta_table where ti_time < (now() - interval 2 hour);
Run Code Online (Sandbox Code Playgroud)

您的 DELETE 将针对表中的每一行进行计算。这个新的 DELETE 在将 ti_time 与时间值(now() - 间隔 2 小时)进行比较时停止,而不是在每一行上计算时间戳差异。

确保 ti_time 已编入索引。如果没有,请执行以下操作:

ALTER TABLE ta_table ADD INDEX (ti_time);
Run Code Online (Sandbox Code Playgroud)

假设表是 MyISAM,您可能还希望每个月定期收缩表,如下所示:

ALTER TABLE ta_table ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)

我希望这个信息帮助 !!!

更新 2011-07-19 08:00 EDT

在我和 lovesh 的上一次聊天室会话中,这是我在运行 MySQL 5.5.12 的 PC 上运行以创建事件的示例:

drop database lovesh;
create database lovesh;
use lovesh
create table mydata (id int not null auto_increment primary key,ti_time timestamp DEFAULT current_timestamp) ENGINE=MyISAM;
DELIMITER $$
DROP PROCEDURE IF EXISTS `lovesh`.`LoadMyData` $$
CREATE PROCEDURE `lovesh`.`LoadMyData` ()
BEGIN
    DECLARE NDX INT;
    SET NDX = 0;
    WHILE NDX < 100 DO
        INSERT INTO mydata (ti_time) VALUES (NOW() - INTERVAL CEILING(14400*RAND()) SECOND);
    SET NDX = NDX + 1;
    END WHILE;
END $$
DELIMITER ;
show create table mydata\G
SHOW CREATE PROCEDURE LoadMyData\G
CALL lovesh.LoadMyData();
CREATE TABLE ta_table LIKE mydata;
ALTER TABLE ta_table DISABLE KEYS;
INSERT INTO ta_table SELECT SQL_NO_CACHE * FROM mydata;
ALTER TABLE ta_table ENABLE KEYS;
CREATE EVENT ev
    ON SCHEDULE
      EVERY 1 MINUTE
      STARTS (NOW() + INTERVAL 1 MINUTE)
    DO
      DELETE FROM ta_table WHERE ti_time > NOW() - INTERVAL 2 HOUR;
SELECT COUNT(1) FROM ta_table;
SELECT SLEEP(62);
SELECT COUNT(1) FROM ta_table;
Run Code Online (Sandbox Code Playgroud)

当 ta_table 是 MyISAM 时,这对我有用。它只是使用 InnoDB 继续运行。这可能是症结所在。

  • @jcolebrand:我希望 MySQL 5.1.58 可以升级到,因为从 5.1.x 到更新的 5.1.x,mysql 架构和元数据布局没有重大变化。就个人而言,我非常小心地将 WAMP 中的 MySQL 5.1 升级到 5.5。 (2认同)
  • @lovesh Rolando 解释了新的 DELETE 如何更有效率(now()-interval 2 小时)只需由解析器计算一次。必须为每一行计算 timestampdiff() 函数,因为它要求在计算中使用该行的 'ti_time'。 (2认同)