Alterando o comprimento de uma coluna em uma grande tabela Innodb com tempo de inatividade mínimo

1

Eu preciso alterar o tamanho de uma coluna em uma tabela innodb do MySQL com 164M linhas. Aqui está o script que quero executar: ALTER TABLE SESSION_DECISION MUDAR NOME DA COLUNA VARCHAR (255);

Quando tentei executar a consulta alter, o banco de dados deu uma batida por uma hora e não concluiu a tarefa. Os usuários que acessam o sistema (que precisavam escrever na tabela) foram bloqueados. Este é um sistema ao vivo, então acabei ctrl-c'ing a solicitação para permitir que os usuários acessem o site.

(isso foi no meio da noite - o uso era mínimo, mas eu estava ficando nervoso).

Estou no MySQL 5.0.77.

Alguma sugestão de como posso alterar a coluna com um mínimo de tempo de inatividade?

    
por Will Glass 10.05.2009 / 12:00

4 respostas

4

Sua melhor opção é configurar um banco de dados escravo usando a replicação do mysql. Supondo que sua alteração de esquema seja aditiva, você pode emitir a atualização nessa réplica, que será bloqueada pela duração da atualização. Feito isso, verifique se seu escravo alcançou todas as atualizações e depois declare um pequeno tempo de inatividade para promover seu banco de dados escravo para o mestre.

Você pode encontrar instruções sobre a configuração da replicação do mysql aqui

    
por 10.05.2009 / 12:12
1

Se seus dados estiverem estritamente inseridos (e não atualizados), você provavelmente poderá fazer algo como:

  • crie uma nova tabela com a definição desejada.
  • copie os dados antigos para a nova tabela (certificando-se de especificar nolock)
  • encerrar o acesso à tabela antiga
  • faça uma atualização incremental do antigo para o novo, apenas para capturar qualquer coisa que tenha sido inserida enquanto você fez a cópia.
  • renomeia a tabela antiga para fora do caminho e a nova tabela é inserida
  • restaurar acesso
por 10.05.2009 / 16:21
0

Claro, demora muito. Você deve entender que, ao alterar o tipo de dados da coluna, você altera a estrutura de dados subjacente, para que os dados precisem ser movidos fisicamente e isso pode levar um bom tempo. Eu não sei sobre a capacidade do seu hardware, mas de qualquer forma, vai demorar mais de uma hora (pense, durante a noite).

Quanto à maneira de reduzir o tempo de inatividade, - você não pode fazê-lo diretamente. Eu suponho que você não tem uma instância de backup do banco de dados, não é?

    
por 10.05.2009 / 12:09
0

Eu ouço muitas pessoas se encolherem quando você menciona a execução de um banco de dados em uma VM. A verdade é que depende da VM. Se você não estiver virtualizando hardware, não sofrerá a penalidade de desempenho que eles temem. Usando a paravirtualização via Xen (ouvi coisas boas sobre o OpenVZ, mas não o usei.) Você pode fazer exatamente o que Dave Cheney disse (qual é a abordagem correta) e só tem que usar uma peça de hardware.

As ferramentas / conceitos em jogo seriam:

  1. Virtualização Xen (para paravirtualização)
  2. LVM (para copiar seus dados via instantâneo)
  3. interfaces virtuais (eth0: 1, eth0: 2, etc.), ifup & ifdown para implementar ...
  4. STONITH

Isso, obviamente, não é um guia completo, mas uma recomendação para uma combinação sólida de tecnologias que você pode pesquisar e implementar de uma maneira que atenda às suas necessidades. Minha abordagem é um pouco mais sobre estar preparado para o futuro, onde Dave Cheney está lidando com o que você (provavelmente) tem hoje.

    
por 28.05.2009 / 07:02

Tags