Tenho em minhas mãos um cluster Percona XtraDB de 3 nós onde, de acordo com mysqlcheck
, algumas tabelas estão corrompidas (alguns índices contêm o número errado de entradas):
mydb.mytable
Warning : InnoDB: Index 'foo' contains 1393929 entries, should be 1393918.
Warning : InnoDB: Index 'bar' contains 1393921 entries, should be 1393918.
error : Corrupt
Qual é a melhor prática para executar OPTIMIZE TABLE
em um cluster?
Fiz alguns experimentos em um ambiente de teste sem usuários e parece que um OPTIMIZE TABLE
em um nó não propaga automaticamente seu efeito para os outros nós. Isso é consistente com o fato de que este comando modifica os índices e o espaço de armazenamento da tabela, não seu conteúdo ou sua definição.
Quais poderiam ser as desvantagens de executar o comando em um ambiente de produção em cada nó, deixando-o completo antes de executá-lo no nó seguinte?
Qual seria o efeito sobre os usuários, considerando que o MySQL (e o Percona XtraDB Cluster, até onde eu sei) não suporta bloqueios de tabelas distribuídas? Isso deixaria o cluster em um estado inconsistente?
Se houver necessidade de executar
OPTIMIZE TABLE
no PXC, você pode conseguir isso negando sua gravação em logs binários em uma das três (3) maneiras:MÉTODO 1
MÉTODO #2
MÉTODO #3
SUGESTÃO
Execute um dos
OPTIMIZE TABLE
cenários acima em um nó PXC por vez enquanto redireciona leituras e gravações do cluster. Se os dados forem grandes, remova o nó PXC do cluster, executeOPTIMIZE TABLE
à vontade e adicione o PXC de volta ao cluster.Em um cluster de três nós, a melhor abordagem seria usar pt-online-schema-change.
Então execute a seguir.
A melhor prática para
OPTIMIZE TABLE
qualquer sistema InnoDB: não o execute. Quase nunca vale o esforço.Se você precisar fazer isso em um cluster do Galera (como o PXC), trate-o como um
ALTER
: use TOI (para simplificar) se for uma tabela pequena; RSU (para evitar bloqueio) se for grande.Como
OPTIMIZE
não altera o conteúdo da tabela, apenas o layout, suas perguntas deixando-a completa, inconsistências são irrelevantes.