AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 3910
Accepted
lovesh
lovesh
Asked: 2011-07-18 13:10:03 +0800 CST2011-07-18 13:10:03 +0800 CST 2011-07-18 13:10:03 +0800 CST

MySQL 事件不运行

  • 772

我正在运行与Windowsmysql 5.1.41捆绑在一起的。xampp问题是事件不会自动运行,即使event scheduler是ON. 我有一个名为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

现在这个事件应该删除任何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 mysql-5.5
  • 2 2 个回答
  • 21604 Views

2 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-07-18T16:05:43+08:002011-07-18T16:05:43+08:00

    我对事件调度程序问题的错误列表进行了一些真正的挖掘。

    似乎事件调度程序的某个时间计算是不可移植的。此错误已从 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;
    

    重组它如下:

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

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

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

    ALTER TABLE ta_table ADD INDEX (ti_time);
    

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

    ALTER TABLE ta_table ENGINE=MyISAM;
    

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

    更新 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;
    

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

    • 5
  2. Derek Downey
    2011-07-19T11:35:42+08:002011-07-19T11:35:42+08:00

    我相信您的事件必须使用完全限定的模式和表名来定义:

    在 MySQL 5.1.6 中,在事件的操作语句中引用的任何表都必须使用它发生的模式的名称进行完全限定(即,作为 schema_name.table_name)。

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

    所以应该重新定义您在 EVENT 中的查询(使用 Rolando 改进的删除查询):

    DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);
    
    • 3

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve