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?

Correu
fonte
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.

RolandoMySQLDBA
fonte
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