Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Alterando grandes tabelas MySQL InnoDB


Editar 2016: lançamos recentemente (agosto de 2016) gh-ost , modificando minha resposta para refleti-la.

Hoje existem várias ferramentas que permitem que você altere tabelas online para MySQL. Esses são:

Vamos considerar o "normal" `ALTER TABLE`:


Uma tabela grande levará muito tempo para ALTER . innodb_buffer_pool_size é importante, assim como outras variáveis, mas em uma tabela muito grande elas são todas insignificantes. Só leva tempo.

O que o MySQL faz para ALTER uma tabela é criar uma nova tabela com novo formato, copiar todas as linhas e depois alternar. Durante este tempo, a mesa fica completamente bloqueada.

Considere sua própria sugestão:


Provavelmente terá o pior desempenho de todas as opções. Por que é que? Como você está usando uma tabela InnoDB, o INSERT INTO tablename_tmp SELECT * FROM tablename faz uma transação. um enorme transação. Ele criará ainda mais carga do que o ALTER TABLE normal .

Além disso, você terá que desligar seu aplicativo nesse momento para que ele não escreva (INSERT , DELETE , UPDATE ) à sua mesa. Se isso acontecer - toda a sua transação é inútil.

O que as ferramentas online oferecem


As ferramentas não funcionam todas da mesma forma. No entanto, o básico é compartilhado:
  • Eles criam uma tabela "sombra" com esquema alterado
  • Eles criam e usam gatilhos para propagar as alterações da tabela original para a tabela fantasma
  • Eles lentamente copie todas as linhas da sua tabela para a tabela sombra. Eles fazem isso em partes:digamos, 1.000 linhas por vez.
  • Eles fazem tudo isso enquanto você ainda pode acessar e manipular a tabela original.
  • Quando satisfeitos, eles trocam os dois, usando um RENAME .

O kit openark ferramenta está em uso há 3,5 anos. A ferramenta Percona tem alguns meses, mas possivelmente mais testada que a anterior. Diz-se que a ferramenta do Facebook funciona bem para o Facebook, mas não fornece uma solução geral para o usuário médio. Eu mesmo não usei.

Editar 2016: gh-ost é uma solução sem gatilho, que reduz significativamente a carga de gravação do mestre no mestre, desacoplando a carga de gravação de migração da carga normal. É auditável, controlável, testável. Nós o desenvolvemos internamente no GitHub e o lançamos como código aberto; estamos fazendo todas as nossas migrações de produção via gh-ost hoje. Veja mais aqui .

Cada ferramenta tem suas próprias limitações, observe atentamente a documentação.

A maneira conservadora


A maneira conservadora é usar uma replicação Mestre-Mestre Ativo-Passivo, faça o ALTER no servidor em espera (passivo), troque de função e faça o ALTER novamente no que costumava ser o servidor ativo, agora passivo. Essa também é uma boa opção, mas requer um servidor adicional e um conhecimento mais profundo de replicação.