AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 3910
Accepted
lovesh
lovesh
Asked: 2011-07-18 13:10:03 +0800 CST2011-07-18 13:10:03 +0800 CST 2011-07-18 13:10:03 +0800 CST

Evento MySQL não é executado

  • 772

estou executando o mysql 5.1.41que veio junto com o xamppwindows. o problema é que o evento não roda automaticamente mesmo quando o event scheduleré ON. Eu tenho uma tabela chamada ta_tableusing innodb enginee ela possui 4 campos, um dos quais ti_timecom um timestamptipo com valor padrão de current timestamp. esse campo ti_timerecebe o valor do timestamp no qual a linha é inserida. agora eu quero deletar todas as linhas que tem 2 horas da tabela ta_tableentã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_timecampo 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 statedo 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_tableos 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

mysql mysql-5.5
  • 2 2 respostas
  • 21604 Views

2 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-07-18T16:05:43+08:002011-07-18T16:05:43+08:00

    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:

    delete from ta_table where timestampdiff(minute,ti_time,now())>120;
    

    Reestruture-o da seguinte forma:

    delete from ta_table where ti_time < (now() - interval 2 hour);
    

    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:

    ALTER TABLE ta_table ADD INDEX (ti_time);
    

    Supondo que a tabela seja MyISAM, você também pode diminuir periodicamente a tabela todos os meses, assim:

    ALTER TABLE ta_table ENGINE=MyISAM;
    

    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:

    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;
    

    Isso funcionou para mim quando ta_table era MyISAM. Ele continuou rodando usando o InnoDB. Este pode ser o ponto de discórdia.

    • 5
  2. Derek Downey
    2011-07-19T11:35:42+08:002011-07-19T11:35:42+08:00

    Acredito que seu evento deva ser definido usando schema e tablename totalmente qualificados:

    No MySQL 5.1.6, qualquer tabela referenciada na instrução de ação de um evento deve ser totalmente qualificada com o nome do esquema no qual ela ocorre (isto é, como schema_name.table_name).

    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):

    DELETE FROM `ta_db`.`ta_table` WHERE ti_time < (NOW() - INTERVAL 2 HOUR);
    
    • 3

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve