Estratégias de Mudança de Esquema Online para Tabelas Grandes do MySQL

3

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

    
por sinping 03.10.2011 / 16:51

2 respostas

2

Eu fiz alterações no esquema on-line de tabelas com mais de 100 milhões de linhas usando o método do acionador e elas funcionam muito bem.

  1. Crie uma nova tabela com a estrutura desejada.
  2. Adicione o acionador à tabela antiga para copiar os dados inseridos para a nova tabela. Seria algo parecido com:

    DELIMITER |
    CREATE TRIGGER original_to_new AFTER INSERT ON original_table
      FOR EACH ROW BEGIN
    INSERT INTO new_table SET col1 = NEW.col1, col2 = NEW.col2...
    END;
    |
    DELIMITER ;
    
  3. Anote o primeiro ID de incremento automático movido para a nova tabela com o acionador.

  4. Copie os dados da tabela antiga para a nova até o ID capturado na etapa 3.
  5. Trocar nomes de tabelas. %código%
  6. Solte a tabela antiga
por 03.10.2011 / 19:09
0

O pessoal da Continuent inclui essa capacidade em seu produto Tungsten Enterprise. Por exemplo, consulte: link

    
por 03.10.2011 / 21:07