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 TABLE
comando 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 TABLE
acabamentos, tudo volta ao normal.
Eu sei que um dos escravos não recebeu nenhuma leitura durante a execução, TRUNCATE TABLE
pois é 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?
fonte
Respostas:
O uso
TRUNCATE TABLE
em 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 aguentandouser_engagements
, isso também pode potencialmente aguentarTRUNCATE TABLE
.Você pode renomear a tabela para que fique imediatamente disponível
Isso deve replicar rapidamente, exceto a última instrução.
De uma chance !!!
Se você possui o MySQL 5.1.16+,
TRUNCATE TABLE
requer o privilégio DROP . Minha resposta executa o queTRUNCATE TABLE
agora faz.Se você possui o MySQL 5.1.15 e vice-versa, precisa do privilégio DELETE , que minha resposta abrange.
fonte
RENAME TABLE
declaração com várias partes em vez deALTER TABLE
tornar a renomeação atômica:RENAME TABLE user_engagements TO user_engagements_zap, user_engagements_new TO user_engagements;
Outra consideração é queDROP TABLE
faz com que o LRU_mutex seja bloqueado enquanto a lista LRU é varrida e cada entrada é removida - isso interromperá o servidor. O Percona Server precisainnodb_lazy_drop_table
ajudar com isso, masDROP TABLE
ainda pode demorar muito em sistemas de arquivos ext.truncate table
está demorando muito tempo por causa das partições na tabela (1000), posso removê-las se isso levar à solução?