MySQL evento non viene eseguito
Domanda
Sono in esecuzione mysql 5.1.41
fornito in dotazione con xampp
sulle finestre. il problema è che l'evento doesnt eseguito automaticamente anche quando il event scheduler
è ON
. Ho una tabella denominata ta_table
utilizzando innodb engine
e dispone di 4 campi di cui uno è ti_time
con un tipo timestamp
con valore predefinito di current timestamp
. questo campo ti_time
viene fornito il valore di timestamp in cui è inserita la riga. ora voglio eliminare tutte le righe che sono 2 ore di vita dalla ta_table
tavolo così ho creato un evento
gli sguardi evento come questo
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
Ora, questo evento dovrebbe eliminare le righe con una maggiore campo ti_time
di 2 ore (120 minuti). quando eseguo questa query
delete from ta_table where timestampdiff(minute,ti_time,now())>120;
funziona. cancella le righe di età superiore a 2 ore. il che significa che la mia domanda è corretta ma l'evento non è in esecuzione. il mio scheduler evento è in esecuzione che ho confermato da show processlist
e mostra 2 preocesses radice e scheduler evento.
la state
dello scheduler evento è waiting for next activation
.
Quando ho eseguito questa query
SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE event_name = 'ev'
dà come risultato
status = enabled
last executed=2011-07-18 02:36:38
ma quando vedo la ta_table
tavolo i record non vengono cancellati? che cosa è sbagliato in questo?
Modifica:
Come su suggerimento che mysql aggiornato di RolandoMySQLDBA 5.1.14 a MySQL 5.5 ma l'evento non riesce ancora
Soluzione
Ho fatto qualche vero e proprio scavo nella lista di bug per le questioni Event Scheduler.
Sembra che un certo calcolo del tempo per lo scheduler evento non era portatile . Questo problema è stato risolto a partire da MySQL 5.1.48 (Fisso 2 giugno 2010).
C'è stato un problema passato circa MOSTRA EVENTI non ottenere gli eventi dal database corretto . Questo problema è stato risolto a partire da MySQL 5.1.57 (Fisso 5 Maggio 2011).
L'ultimo errore di pianificazione è stato fissato 5 luglio 2011 in MySQL 5.1.58
Si sta utilizzando MySQL 5.1.41. Si consiglia di effettuare l'aggiornamento alla versione più recente di MySQL 5.1, che è 5.1.58 . Niente insetti scheduler esiste a partire da oggi.
CAVEAT
In un'altra nota, vorrei modificare la query SQL non solo di fare meno lavoro
Invece di query DELETE:
delete from ta_table where timestampdiff(minute,ti_time,now())>120;
ristrutturarlo come segue:
delete from ta_table where ti_time < (now() - interval 2 hour);
Il tuo DELETE calcolerà contro ogni riga della tabella. Questa nuova fermate DELETE breve quando si confrontano ti_time contro un valore di tempo (ora () - un intervallo di 2 ora). Invece di calcolare TIMESTAMPDIFF su ogni riga
Assicurarsi ti_time è indicizzato. In caso contrario, fare questo:
ALTER TABLE ta_table ADD INDEX (ti_time);
Supponendo che la tabella è MyISAM, si consiglia inoltre di compattare periodicamente la tabella di ogni mese, in questo modo:
ALTER TABLE ta_table ENGINE=MyISAM;
Spero che queste informazioni aiuta !!!
UPDATE 2011-07-19 08:00 EDT
Dal ultima sessione di chat room lovesh e ho avuto, qui è l'esempio mi sono imbattuto per creare l'evento sul mio PC che esegue 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;
Questo ha funzionato per me, quando era ta_table MyISAM. E 'solo continuò a correre utilizzando InnoDB. Questo può essere il punto di attaccare.
Altri suggerimenti
Credo che il vostro evento deve essere definito utilizzando lo schema completo e nometabella:
In MySQL 5.1.6, qualsiasi tabella fa riferimento nella dichiarazione di azione di un evento deve essere completo con il nome dello schema in cui si verifica (che è, come schema_name.table_name).
Riferimento: http: // www.cs.duke.edu/csl/docs/mysql-refman/events.html#events-limitations-restrictions
Quindi, la query nella evento deve essere ridefinito (utilizzando una migliore query di eliminazione di Rolando):
DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);