MySQLイベントは実行されません
質問
私は走っています mysql 5.1.41
それは束ねられました xampp
Windowsで。問題は、イベントが自動的に実行されないことです event scheduler
は ON
. 。名前付きのテーブルがあります ta_table
使用 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日固定)。
正しいデータベースからイベントを取得していないショーイベントについての過去の問題がありました. 。このバグは、MySQL 5.1.57の時点で修正されました(2011年5月5日固定)。
最新のスケジューラバグは、2011年7月5日にMySQL 5.1.58で修正されました
MySQL 5.1.41を使用しています。 5.1.58であるMySQL 5.1の最新バージョンにアップグレードすることをお勧めします. 。今日の時点では、スケジューラバグは存在しません。
警告
別の注意として、私は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をTime値(Now()-interval 2時間)と比較するときに短く停止します。
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を実行しているPCでイベントを作成するために実行した例です。5.5.12:
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を使用して実行され続けました。これが固着ポイントかもしれません。
他のヒント
あなたのイベントは、完全に資格のあるスキーマとタブネームを使用して定義する必要があると思います。
MySQL 5.1.6では、イベントのアクションステートメントで参照されているテーブルは、発生するスキーマの名前(つまり、schema_name.table_nameとして)で完全に適格でなければなりません。
参照: http://www.cs.duke.edu/csl/docs/mysql-refman/events.html#events-limitations-restrictions
したがって、イベントでのクエリは再定義する必要があります(Rolandoの改善された削除クエリを使用):
DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);