我在跑步 mysql 5.1.41 捆绑在一起 xampp 在窗户上。问题在于,即使在 event schedulerON. 。我有一张名字叫 ta_table 使用 innodb engine 它有4个字段 ti_timetimestamp 类型为默认值的 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日修复)。

关于显示事件没有从正确的数据库获得事件的过去问题. 。此错误已固定为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 from ta_table where timestampdiff(minute,ti_time,now())>120;

重组如下:

delete from ta_table where ti_time < (now() - interval 2 hour);

您的删除将对表中的每一行进行计算。当将Ti_time与时间值(现在() - 间隔2小时)进行比较时,此新删除将停止,而不是计算每一行的时间戳。

确保索引Ti_Time。如果没有,请这样做:

ALTER TABLE ta_table ADD INDEX (ti_time);

假设桌子是Myisam,您可能还希望像这样定期缩小桌子:

ALTER TABLE ta_table ENGINE=MyISAM;

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

更新2011-07-19 08:00 EDT

从上一个聊天室会话Loveh和我有过,这是我在运行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;

当Ta_table是Myisam时,这对我有用。它只是使用InnoDB一直在运行。这可能是症状。

其他提示

我相信必须使用完全合格的模式和tablename来定义您的活动:

在MySQL 5.1.6中,事件的操作语句中引用的任何表都必须完全符合其发生的模式的名称(即Schema_name.table_name)。

参考: http://www.cs.duke.edu/csl/docs/mysql-refman/events.html#events-limitations限制

因此,应重新定义您的查询(使用Rolando的改进删除查询):

DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);
许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top