Question

Je suis en cours d'exécution mysql 5.1.41 qui a été fournie avec xampp sur les fenêtres. le problème est que l'événement ne marche pas exécuté automatiquement, même lorsque le event scheduler est ON. j'ai une table nommée ta_table en utilisant innodb engine et dispose de 4 champs dont l'un est ti_time avec un type de timestamp avec une valeur par défaut de current timestamp. ce ti_time de champ est donnée à la valeur de l'horodatage à laquelle la ligne est insérée. Maintenant, je veux supprimer toutes les lignes qui sont 2 heures vieux de la table ta_table donc je créé un événement l'apparence d'événements comme celui-ci

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

cet événement doit supprimer toutes les lignes avec champ ti_time supérieur à 2 heures (120 minutes). quand j'exécute cette requête

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

il fonctionne. il supprime les lignes de plus de 2 heures. ce qui signifie ma requête est correcte mais l'événement ne fonctionne pas. mon planificateur d'événements est en cours d'exécution que je confirme par show processlist et il montre 2 preocesses racine et planificateur d'événements. le state du planificateur d'événement est waiting for next activation. quand je couru cette requête

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

il donne le résultat que

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

mais quand je vois la table ta_table les enregistrements ne sont pas supprimés? ce qui est le problème?

Edit:

i de suggestion de RolandoMySQLDBA mis à jour mysql 5.1.14 à mysql 5.5 mais l'événement échoue encore

Était-ce utile?

La solution

Je l'ai fait quelques recherches réel dans la liste des bogues pour les questions de planificateur d'événements.

Il semble qu'un certain calcul de temps pour le planificateur d'événement n'a pas été portable . Ce bug a été corrigé en MySQL 5.1.48 (fixe 2 Juin 2010).

Il y avait un problème passé à propos retransmettent les événements ne se événements de la base de données correcte . Ce bug a été corrigé en MySQL 5.1.57 (fixe 5 mai 2011).

Le dernier bug du planificateur a été fixé au 5 Juillet 2011 à MySQL 1.5.58

Vous utilisez MySQL 5.1.41. Vous pouvez passer à la dernière version de MySQL 5.1 qui est 01.05.58 . Aucun bug planificateur existe à partir d'aujourd'hui.

CAVEAT

Sur une autre note, je changerais la requête SQL non seulement faire moins de travail

Au lieu de votre requête SUPPRIMER:

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

Restructurer il suit que:

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

Votre calculate SUPPRIMER volonté contre toutes les lignes de la table. Cette nouvelle arrête SUPPRIMER court lorsque l'on compare ti_time à une valeur de temps (maintenant () - intervalle de 2 heures). Au lieu de calculer TIMESTAMPDIFF sur chaque ligne

Assurez-vous que ti_time est indexé. Sinon, faites ceci:

ALTER TABLE ta_table ADD INDEX (ti_time);

En supposant que la table est MyISAM, vous pouvez également réduire périodiquement la table chaque mois comme ceci:

ALTER TABLE ta_table ENGINE=MyISAM;

J'espère que cette information aide !!!

Mise à jour 2011-07-19 08:00 HAE

De la dernière salle lovesh session de chat et moi avons eu, voici l'exemple que je courais pour créer l'événement sur mon PC exécutant MySQL 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;

Cela a fonctionné pour moi quand ta_table était MyISAM. Il a juste continué à courir en utilisant InnoDB. Cela peut être le point de coller.

Autres conseils

Je crois que votre événement doit être défini en utilisant le schéma complet et tablename:

  

En MySQL 5.1.6, une table référencée dans l'instruction d'action d'un événement doit être qualifié avec le nom du schéma dans lequel il se produit (qui est, comme schema_name.table_name).

Référence: http: // www.cs.duke.edu/csl/docs/mysql-refman/events.html#events-limitations-restrictions

Ainsi, votre requête dans l'événement doit être redéfinie (en utilisant la requête de suppression améliorée de Rolando):

DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top