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

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top