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 / 28055
Accepted
Haseena
Haseena
Asked: 2012-11-02 22:18:56 +0800 CST2012-11-02 22:18:56 +0800 CST 2012-11-02 22:18:56 +0800 CST

A instrução TRUNCATE TABLE às vezes trava

  • 772

Por que a TRUNCATE TABLEdeclaração trava às vezes? Quais são as razões para este tipo de problema?

Estou migrando do MySQL para o MariaDB. Este problema não acontece com o MySQL, apenas com o MariaDB.

A declaração suspensa é simplesmente:

TRUNCATE TABLE sampledb.datatable;

O que pode fazer com que isso aconteça e como posso corrigi-lo?

Outra observação é se a tabela tiver alguns dados, pode ser uma ou duas linhas, então a consulta truncada funciona com sucesso. Caso contrário, a tabela tem muitos dados, a consulta fica travada.

mysql myisam
  • 7 7 respostas
  • 31746 Views

7 respostas

  • Voted
  1. Best Answer
    Stoleg
    2013-05-26T13:34:57+08:002013-05-26T13:34:57+08:00

    A razão pela qual você experimenta degradação de desempenho ou trava durante a execução TRUNCATE TABLEé um problema conhecido com esta declaração. Consulte o Bug #68184:Truncate table causa innodb stalls. Existem outros números de bugs abertos para versões anteriores também.

    Você pode usar:

    CREATE TABLE log_table_new LIKE log_table;
    RENAME TABLE log_table TO log_table_old, log_table_new TO log_table;
    DROP TABLE log_table_old;
    

    Fica complicado para tabelas com AUTO_INCREMENTvalores: uma nova tabela é criada com um AUTO_INCREMENTvalor que é imediatamente obtido na tabela de trabalho. Se você não quiser usar os mesmos valores, você pode:

    ALTER TABLE log_table_new AUTO_INCREMENT=some high enough value;
    
    • 16
  2. RolandoMySQLDBA
    2013-05-24T09:57:47+08:002013-05-24T09:57:47+08:00

    Você deve lembrar que TRUNCATE TABLE é DDL e não DML.

    Em vez de descobrir onde no encanamento do TRUNCATE TABLE ele está ficando preso, você pode ter que resolver o problema com suas próprias mãos, substituindo este

    TRUNCATE TABLE sampledb.datatable;
    

    com isso

    CREATE TABLE sampledb.datatablenew LIKE sampledb.datatable;
    ALTER TABLE sampledb.datatable RENAME sampledb.datatablezap;
    ALTER TABLE sampledb.datatablenew RENAME sampledb.datatable;
    DROP TABLE sampledb.datatablezap;
    

    Isso pode apenas desligar o problema (talvez pendurado no DROP TABLE), mas a tabela fica disponível rapidamente. DROP TABLEfoi melhorado no MySQL 5.5.23 .

    Eu discuti TRUNCATE TABLE em meus posts anteriores

    • Jul 09, 2012: O que pode fazer com que TRUNCATE TABLE demore muito tempo?
    • Jan 17, 2012; Problema com os tamanhos de arquivo "por tabela" do InnoDB
    • Sep 28, 2011: Como recuperar uma tabela InnoDB cujos arquivos foram movidos

    De uma chance !!!

    • 6
  3. Gordan Bobić
    2021-11-28T04:14:24+08:002021-11-28T04:14:24+08:00

    Há um bug de longa data no InnoDB que afeta tanto o MySQL ( #98869 ) quanto o MariaDB ( MDEV-9459 ) que resulta em longas paralisações, proporcionais ao tamanho de seu pool de buffers (normalmente cerca de 1 segundo por 32 GB de pool de buffers, dependendo do o desempenho de sua CPU e largura de banda de memória de seu servidor).

    Isso foi corrigido no MySQL 8.0.23 e MariaDB 10.2.19. Se a atualização não for uma opção (e eu entendo que para muitos pode não ser uma opção palatável por vários motivos), existem mitigações e soluções alternativas que podem ser aplicadas para esses stalls DROP/TRUNCATE com MySQL e MariaDB .

    Por exemplo, o bug não se manifesta de você DELETE todas as linhas da tabela antes de fazer um DROP. Se isso estiver afetando você no contexto de uso de tabelas temporárias, você pode alternar seu mecanismo de tabela temporária padrão para MyISAM (ou especificar MyISAM explicitamente ao criar suas tabelas temporárias).

    • 5
  4. David Spillett
    2012-11-03T02:07:42+08:002012-11-03T02:07:42+08:00

    Sem mais informações, é difícil dizer, e não sou especialista especificamente em MySQL/MariaDB, mas os motivos gerais para uma consulta inesperadamente demorar mais do que o normal para ser executado são:

    • Bloqueios nessa tabela: a consulta pode ficar esperando que outras transações, que mantêm bloqueios nessa tabela, sejam concluídas. Nesse caso, a instrução será pausada, sem usar recursos de CPU ou E/S, até que os bloqueios concorrentes sejam liberados.
    • Bloqueios em outras tabelas: se você tiver chaves estrangeiras em outro lugar se referindo a essa tabela, a operação de truncar precisará certificar-se de que não está descartando linhas que ainda são referenciadas. Isso significa que os bloqueios nessas outras tabelas também podem fazer com que ela seja pausada.
    • Diferenças nas verificações de integridade referencial: se o seu novo banco de dados tiver FKs definidos referindo-se a essa tabela onde o antigo não tinha, isso também poderia explicar uma diferença na velocidade de truncar. Se a tabela que está sendo truncada e/ou as tabelas de referência forem muito grandes, isso pode estar longe de ser instantâneo (se esse for o motivo de seus diferentes comportamentos observados, você esperaria ver a instrução impor alguma carga de E/S e/ou CPU).
    • 2
  5. Ste
    2013-05-24T09:20:59+08:002013-05-24T09:20:59+08:00

    Em mariadb truncate table atua como uma tabela de descarte e recriação implícita da tabela vazia. No entanto, as operações de truncamento não podem ser executadas se a sessão tiver um bloqueio de tabela ativo.

    Somente com a tabela InnoDB, o InnoDB processa TRUNCATE TABLEexcluindo as linhas uma a uma se houver alguma FOREIGN KEYrestrição que faça referência à tabela. Se não houver FOREIGN KEYrestrições, o InnoDB executa um truncamento rápido, eliminando a tabela original e criando uma vazia com a mesma definição. Como você afirma que se uma tabela tiver poucos registros truncar é rápido e se você tiver muitos registros truncar é infinito, posso supor que você tenha InnoDB e FK.

    Além disso, antes de truncar sua tabela, tente IS_FREE_LOCK(str)a função para verificar se a tabela está bloqueada. Em caso afirmativo, existe a IS_USED_LOCKfunção de recuperar o thread que está segurando o bloqueio.

    • 1
  6. kenorb
    2016-08-09T05:25:08+08:002016-08-09T05:25:08+08:00

    O TRUNCATEpode travar, porque outros processos podem usar esta tabela, portanto, para verificar, execute no shell:

    mysqladmin proc
    

    Em seguida, mate as consultas que estão usando (mude 123para Id do processo):

    mysqladmin kill 123
    

    Também rodando:

    mysql -e "SHOW ENGINE INNODB STATUS\G"
    

    também pode ajudar a investigar qualquer travamento.

    Relacionado: Como depurar o tempo limite de espera de bloqueio excedido?

    • 0
  7. Ashu Phaugat
    2018-06-14T18:46:52+08:002018-06-14T18:46:52+08:00

    Eu enfrentei o mesmo problema e foi resolvido reiniciando o servidor mysql.

    systemctl restart mysqld
    

    Eu sei que esta não é uma solução esperada, mas se você estiver preso, poderá reiniciar o servidor mysql.

    • -1

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 ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 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

    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
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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