MySQL 事件不執行
我正在執行與Windows
mysql 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 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 繼續執行。這可能是癥結所在。