MySQL Event ne fonctionne pas
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
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);