estou executando o mysql 5.1.41
que veio junto com o xampp
windows. o problema é que o evento não roda automaticamente mesmo quando o event scheduler
é ON
. Eu tenho uma tabela chamada ta_table
using innodb engine
e ela possui 4 campos, um dos quais ti_time
com um timestamp
tipo com valor padrão de current timestamp
. esse campo ti_time
recebe o valor do timestamp no qual a linha é inserida. agora eu quero deletar todas as linhas que tem 2 horas da tabela ta_table
então eu criei um evento o evento se parece com isso
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
agora este evento deve excluir todas as linhas com ti_time
campo maior que 2 horas (120 minutos). quando eu executo esta consulta
delete from ta_table where timestampdiff(minute,ti_time,now())>120;
funciona. ele exclui as linhas com mais de 2 horas. o que significa que minha consulta está correta, mas o evento não está em execução. meu agendador de eventos está em execução, o que eu confirmei show processlist
e mostra 2 pré-processos raiz e agendador de eventos. o state
do agendador de eventos é waiting for next activation
. quando eu executei esta consulta
SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE event_name = 'ev'
dá resultado como
status = enabled
last executed=2011-07-18 02:36:38
mas quando vejo a tabela ta_table
os registros não são apagados? o que há de errado com isso?
Editar:
Por sugestão de RolandoMySQLDBA, atualizei o mysql 5.1.14 para o mysql 5.5, mas o evento ainda falha
Eu fiz algumas pesquisas reais na lista de bugs para problemas do agendador de eventos.
Parece que um determinado cálculo de tempo para o agendador de eventos não era portátil . Este bug foi corrigido a partir do MySQL 5.1.48 (corrigido em 2 de junho de 2010).
Houve um problema anterior sobre SHOW EVENTS não obter eventos do banco de dados correto . Este bug foi corrigido a partir do MySQL 5.1.57 (corrigido em 5 de maio de 2011).
O último bug do agendador foi corrigido em 5 de julho de 2011 no MySQL 5.1.58
Você está usando MySQL 5.1.41. Você pode querer atualizar para a versão mais recente do MySQL 5.1, que é 5.1.58 . Nenhum bug do agendador existe a partir de hoje.
EMBARGO
Em outra nota, eu mudaria a consulta SQL para não apenas fazer menos trabalho
Em vez de sua consulta DELETE:
Reestruture-o da seguinte forma:
Seu DELETE calculará em cada linha da tabela. Este novo DELETE é interrompido ao comparar ti_time com um valor de tempo (now() - intervalo de 2 horas) em vez de computar timestampdiff em cada linha.
Certifique-se de que ti_time esteja indexado. Se não, faça isso:
Supondo que a tabela seja MyISAM, você também pode diminuir periodicamente a tabela todos os meses, assim:
Eu espero que essa informação ajude !!!
ATUALIZAÇÃO 2011-07-19 08:00 EDT
Da última sessão de bate-papo que lovesh e eu tivemos, aqui está o exemplo que executei para criar o evento no meu PC executando o MySQL 5.5.12:
Isso funcionou para mim quando ta_table era MyISAM. Ele continuou rodando usando o InnoDB. Este pode ser o ponto de discórdia.
Acredito que seu evento deva ser definido usando schema e tablename totalmente qualificados:
Referência: http://www.cs.duke.edu/csl/docs/mysql-refman/events.html#events-limitations-restrictions
Portanto, sua consulta no EVENTO deve ser redefinida (usando a consulta de exclusão aprimorada de Rolando):