Mysql

MySQL 事件不執行

  • September 4, 2017

我正在執行與Windowsmysql 5.1.41捆綁在一起的。xampp問題是事件不會自動執行,即使event schedulerON. 我有一個名為ta_tableusing的表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 日修復)開始修復。

過去存在一個關於 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 繼續執行。這可能是癥結所在。

引用自:https://dba.stackexchange.com/questions/3910