O que pode levar o TRUNCATE TABLE a demorar muito tempo?


9

Estou executando o MySQL5.5 com replicação mestre / escravo (1 mestre, 2 escravos).

Eu tenho um processo que é executado uma vez por semana e trunca uma tabela específica. A tabela não é grande e possui apenas alguns milhares de registros.

Por alguma razão, o TRUNCATE TABLEcomando leva muito tempo para ser executado (tanto no mestre quanto no escravo). Demora cerca de 400K ms para executar !! Quando é executado no escravo, faz com que ele fique atrasado do mestre. Após os TRUNCATE TABLEacabamentos, tudo volta ao normal.

Eu sei que um dos escravos não recebeu nenhuma leitura durante a execução, TRUNCATE TABLEpois é um escravo dedicado e o processo que lê desse escravo foi interrompido. Além disso, neste escravo, levou a mesma quantidade de tempo para ser executado.

Aqui está a estrutura da tabela: http://pastebin.com/qEQB4juR

Alguma idéia de como posso acelerar a TABELA TRUNCATE?


Existe alguma partição na mesa?
— Barbaros Alp

Respostas:


8

O uso TRUNCATE TABLEem uma tabela do InnoDB requer um bloqueio de tabela completo, porque TRUNCATE TABLE é DDL (Data Definition Language) e não DML (Data Manipulation).

A ação DELETE FROM user_engagements;não ajudará porque as informações do MVCC são gravadas nos logs de desfazer no ibdata1 e podem impedir que a tabela seja esvaziada. Se alguma transação não confirmada estiver aguentando user_engagements, isso também pode potencialmente aguentar TRUNCATE TABLE.

Você pode renomear a tabela para que fique imediatamente disponível

SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE user_engagements_new LIKE user_engagements;
ALTER TABLE user_engagements RENAME user_engagements_zap;
ALTER TABLE user_engagements_new RENAME user_engagements;
DROP TABLE user_engagements_zap;
SET FOREIGN_KEY_CHECKS = 1;

Isso deve replicar rapidamente, exceto a última instrução.

De uma chance !!!

Se você possui o MySQL 5.1.16+, TRUNCATE TABLErequer o privilégio DROP . Minha resposta executa o que TRUNCATE TABLEagora faz.

Se você possui o MySQL 5.1.15 e vice-versa, precisa do privilégio DELETE , que minha resposta abrange.


2
Eu usaria uma RENAME TABLEdeclaração com várias partes em vez de ALTER TABLEtornar a renomeação atômica: RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements; Outra consideração é que DROP TABLEfaz com que o LRU_mutex seja bloqueado enquanto a lista LRU é varrida e cada entrada é removida - isso interromperá o servidor. O Percona Server precisa innodb_lazy_drop_tableajudar com isso, mas DROP TABLEainda pode demorar muito em sistemas de arquivos ext.
— Aaron Brown

será que truncate tableestá demorando muito tempo por causa das partições na tabela (1000), posso removê-las se isso levar à solução?
— Ran
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.