MySQL evento no se ejecuta
Pregunta
Estoy corriendo mysql 5.1.41
que viene incluido con xampp
en las ventanas. el problema es que el evento se ejecuta automáticamente doesnt incluso cuando el event scheduler
es ON
. Tengo una tabla llamada ta_table
usando innodb engine
y tiene 4 campos uno de los cuales es ti_time
con un tipo timestamp
con valor por defecto de current timestamp
. este ti_time
campo se le da el valor de marca de tiempo en el que se inserta la fila. ahora quiero borrar todas las filas que son 2 horas de vida de la ta_table
mesa, así que creé un evento
las miradas evento como este
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
ahora este evento debe eliminar cualquier filas con mayor campo ti_time
de 2 horas (120 minutos). cuando yo haga esta consulta ??p>
delete from ta_table where timestampdiff(minute,ti_time,now())>120;
funciona. elimina las filas de más de 2 horas. lo que significa mi consulta es correcta pero el evento no se está ejecutando. mi evento planificador está en ejecución, que de que confirmara por show processlist
y se nota raíz 2 preocesses y planificador de eventos.
la state
del planificador de eventos es waiting for next activation
.
Cuando me encontré con esta consulta ??p>
SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE event_name = 'ev'
da como resultado
status = enabled
last executed=2011-07-18 02:36:38
Pero cuando veo a la mesa de ta_table
no se eliminan los registros? es malo en esta?
Editar:
Como sugerencia de que MySQL 5.1.14 actualizado de RolandoMySQLDBA a MySQL 5.5, pero el caso sigue sin
Solución
I did some real digging in the bug list for event scheduler issues.
It seems that a certain time calculation for the event scheduler was not portable. This bug was fixed as of MySQL 5.1.48 (Fixed June 2, 2010).
There was a past issue about SHOW EVENTS not getting events from the correct database. This bug was fixed as of MySQL 5.1.57 (Fixed May 5, 2011).
The latest scheduler bug was fixed July 5, 2011 in MySQL 5.1.58
You are using MySQL 5.1.41. You may want to upgrade to the latest version of MySQL 5.1 which is 5.1.58. No scheduler bugs exists as of today.
CAVEAT
On another note, I would change the SQL query to not only do less work
Instead of your DELETE query:
delete from ta_table where timestampdiff(minute,ti_time,now())>120;
Restructure it as follows:
delete from ta_table where ti_time < (now() - interval 2 hour);
Your DELETE will calculate against every row in the table. This new DELETE stops short when comparing ti_time against a time value (now() - interval 2 hour) instead of computing timestampdiff on every row.
Make sure ti_time is indexed. If not, do this:
ALTER TABLE ta_table ADD INDEX (ti_time);
Assuming the table is MyISAM, you may also want to periodically shrink the table every month like this:
ALTER TABLE ta_table ENGINE=MyISAM;
I hope this information helps !!!
UPDATE 2011-07-19 08:00 EDT
From the last chat room session lovesh and I had, here is the example I ran to create the event on my PC running 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;
This worked for me when ta_table was MyISAM. It just kept running using InnoDB. This may be the sticking point.
Otros consejos
I believe your event must be defined using fully qualified schema and tablename:
In MySQL 5.1.6, any table referenced in an event's action statement must be fully qualified with the name of the schema in which it occurs (that is, as schema_name.table_name).
Reference: http://www.cs.duke.edu/csl/docs/mysql-refman/events.html#events-limitations-restrictions
So your query in the EVENT should be redefined (using Rolando's improved delete query):
DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);