質問

私は走っています mysql 5.1.41 それは束ねられました xampp Windowsで。問題は、イベントが自動的に実行されないことです event schedulerON. 。名前付きのテーブルがあります 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);
ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top