Frage

ich renne mysql 5.1.41 das kam mit gebündelt mit xampp unter Windows. Das Problem ist, dass das Ereignis nicht automatisch ausgeführt wird, wenn die event scheduler ist ON. Ich habe eine Tabelle mit dem Namen ta_table Verwendung innodb engine und es hat 4 Fields eines davon ist ti_time mit einer timestamp Geben Sie mit Standardwert von ein current timestamp. dieses Feld ti_time Wird der Wert des Zeitstempels angegeben, in dem die Zeile eingefügt wird. Jetzt möchte ich alle Zeilen löschen, die 2 Stunden alt vom Tisch sind ta_table Also habe ich ein Ereignis erstellt. Die Veranstaltung sieht so aus

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

Jetzt sollte diese Veranstaltung alle Zeilen mit löschen ti_time Feld mehr als 2 Stunden (120 Minuten). Wenn ich diese Abfrage ausführe

delete from ta_table where timestampdiff(minute,ti_time,now())>120;

Es klappt. Es löscht die Reihen älter als 2 Stunden. Was bedeutet, dass meine Abfrage korrekt ist, aber das Ereignis nicht läuft. Mein Event -Scheduler wird ausgeführt, von dem ich bestätigt habe show processlistund es zeigt 2 Anträge auf Wurzel und Ereignisplaner. das state des Veranstaltungsplaners ist waiting for next activation. Als ich diese Frage leitete

SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE event_name = 'ev'

es gibt Ergebnis als

status = enabled
last executed=2011-07-18 02:36:38

Aber wenn ich den Tisch sehe ta_table Die Datensätze werden nicht gelöscht? Was ist los daran?

Bearbeiten:

Zum Vorschlag von Rolandomysqldba habe ich MySQL 5.1.14 auf MySQL 5.5 verbessert, aber das Ereignis fällt immer noch fehl

War es hilfreich?

Lösung

Ich habe in der Fehlerliste für Ereignisplanerprobleme echte Graben gemacht.

Es scheint, dass eine bestimmte Zeitberechnung für den Veranstaltungsplaner nicht tragbar war. Dieser Fehler wurde nach MySQL 5.1.48 (am 2. Juni 2010) behoben.

Es gab ein früheres Problem mit Show -Ereignissen, die Ereignisse nicht aus der richtigen Datenbank erhalten haben. Dieser Fehler wurde ab MySQL 5.1.57 behoben (behoben 5. Mai 2011).

Der neueste Scheduler -Fehler wurde am 5. Juli 2011 in MySQL 5.1.58 behoben

Sie verwenden MySQL 5.1.41. Möglicherweise möchten Sie auf die neueste Version von MySQL 5.1 upgraden, die 5.1.58 ist. Bis heute gibt es keine Scheduler -Fehler.

VORBEHALT

In einem anderen Fall würde ich die SQL -Abfrage ändern, um nicht nur weniger Arbeit zu leisten

Anstelle Ihrer Löschanfrage:

delete from ta_table where timestampdiff(minute,ti_time,now())>120;

Umstrukturieren Sie es wie folgt:

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

Ihr Löschen wird für jede Zeile in der Tabelle berechnet. Dieser Neulöscher stoppt kurz, wenn Ti_Time mit einem Zeitwert (jetzt () () - Intervall 2 Stunden) verglichen wird, anstatt in jeder Zeile Timestampdiff zu berechnen.

Stellen Sie sicher, dass Ti_Time indiziert ist. Wenn nicht, tun Sie dies:

ALTER TABLE ta_table ADD INDEX (ti_time);

Angenommen, der Tisch ist MyISAM, möchten Sie möglicherweise auch jeden Monat regelmäßig den Tisch verkleinern:

ALTER TABLE ta_table ENGINE=MyISAM;

Ich hoffe diese Informationen helfen !!!

Update 2011-07-19 08:00 EDT

Von der letzten Chatroom -Sitzung Lovesh und ich hatte hier das Beispiel, das ich angelegt habe, um das Ereignis auf meinem PC zu erstellen, das MySQL 5.5.12 ausführt:

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;

Das funktionierte für mich, als Ta_table MyISAM war. Es lief einfach mit InnoDB. Dies kann der Knackpunkt sein.

Andere Tipps

Ich glaube, Ihr Ereignis muss mit voll qualifiziertem Schema und Tablauton definiert werden:

In MySQL 5.1.6 muss jede Tabelle, auf die in der Aktionsanweisung eines Ereignisses verwiesen wird, mit dem Namen des Schemas, in dem sie auftritt, vollständig qualifiziert sein (dh wie schema_name.table_name).

Bezug: http://www.csuke.edu/csl/docs/mysql-refman/events.html#events-limitations-restrictions

Daher sollte Ihre Abfrage im Ereignis neu definiert werden (unter Verwendung von Rolandos verbessertem Löschabfrage):

DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top