Tenho um Cluster Galera (v3) de produção com 3 nós MySQL (v5.7) rodando em modo multi-master. Preciso criar um novo índice (~16 GB) e soltar um índice antigo em uma tabela grande (112 milhões de linhas, ~20 GB de tamanho).
Como o Galera sincroniza instruções DDL, temo que criar um índice grande (~16 GB) possa paralisar a replicação ou causar um SST (State Snapshot Transfer). Planejo executar isso durante uma janela de manutenção, mas quero garantir a segurança da replicação.
Qual é a maneira mais segura de criar esse índice sem afetar o cluster?
Operações a serem realizadas:
Crie um novo índice:
CREATE INDEX index5 ON table_name (c3, c4);
Remova um índice existente (depois de garantir que o novo índice seja usado):
DROP INDEX index4 ON table_name;
Estrutura da tabela (simplificada):
CREATE TABLE table_name (
c1 char(36) NOT NULL,
c2 char(36) NOT NULL,
c3 varchar(100) DEFAULT NULL,
c4 char(36) DEFAULT NULL,
c5 longtext,
c6 datetime DEFAULT NULL,
c7 tinyint(1) DEFAULT '0',
PRIMARY KEY (c1),
KEY index1 (c3, c4),
KEY index2 (c2, c4, c3),
KEY index3 (c4, c3),
KEY index4 (c4, c3, c2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Achei que o que @jkavalik estava falando nos comentários era o modo RSU - Rolling Schema Updates - que é projetado exatamente para esse tipo de coisa. Isso é explicado na documentação do Galera Cluster aqui .
Em cada nó execute:
Então, dentro da mesma sessão, execute seu DDL, ou seja, no seu caso:
Então, basta sair da sessão ou
wsrep_OSU_method
retornar explicitamente ao valor padrão, 'TOI'.Note que é a
SESSION
variável que você precisa definir, não aGLOBAL
variável, como às vezes é mostrado na documentação do RSU. Isso é explicado no blog Persona aqui . (Eles falam sobre PXC, mas é válido para clusters MySQL e MariaDB Galera também.)Se você tiver o Galera Cluster Enterprise Edition, o modo NBO (Non-Blocking Operations) também é uma opção.
Outra opção é a ferramenta de alteração de esquema on-line da Percona .
pt-online-schema-change