Estou curioso para ouvir as estratégias e métodos que as pessoas usam para realizar alterações em tabelas muito grandes no MySQL. Grande pode ser qualquer número de linhas ou tamanho que afetaria a alteração. Por uma questão de conversação, digamos 2 milhões de linhas para as quais qualquer alteração afetará o desempenho normal do aplicativo.
As duas principais estratégias que vejo são para executar o alter em um escravo e depois promovê-lo para ser o mestre depois de ter terminado, ou para criar uma cópia da tabela com os alters pretendidos já feitos, em seguida, copiar e recuperar o atraso os dados e fazer uma renomeação para trocá-los antes de largar o antigo.
Eu estou idealmente procurando um meio para fazer o último. Uma grande preocupação minha é que os gatilhos na tabela estão sendo alterados e, claro, garantir que os dados nas duas tabelas sejam mantidos em sincronia antes de serem trocados. Estou a pensar que o potencial para erros ou dados em falta pode ser reduzido até certo ponto, fazendo uso da variável read_only em pontos-chave no processo para garantir que os dados não estão a mudar ao mexer com os accionadores e depois de ter apanhado todos os dados. Eu entendo que teria um impacto sobre o aplicativo usando o banco de dados, mas é melhor do que arriscar dados corrompidos.
Eu tenho procurado utilitários e estratégias para fazer isso e há vários por aí. Uma notável é essa, que o Facebook usou como base para suas alterações online. : documentação do kit openark . O processo é então elaborado aqui: Pensamentos e idéias para mudança de esquema online
Quais são suas experiências com qualquer um dos métodos? Que armadilhas e pegadinhas você encontrou? Qual você prefere / sugere e por quê?
O Percona / Maatkit também tem o seu próprio: pt-online-schema-change