Eu preciso criar um índice em uma tabela MySQL de ~ 5 milhões de linhas. É uma tabela de produção, e temo um bloqueio completo de tudo se eu executar uma instrução CREATE INDEX ...
Existe uma maneira de criar esse índice sem bloquear inserções e seleções?
Só me perguntando, não tenho como parar, criar índice e reiniciar meu sistema!
mysql
indexing
production
alter-table
table-locking
noturno
fonte
fonte
Respostas:
Atualização [2017]: MySQL 5.6 tem suporte para atualizações de índice online
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-index-syntax-notes
[2015] Atualizando a tabela indica a escrita de blocos no MySQL 5.5
Da resposta acima:
Isso é **** FALSE **** (pelo menos para tabelas MyISAM / InnoDB, que é o que 99,999% das pessoas usam. A Edição em cluster é diferente.)
Fazer operações UPDATE em uma tabela irá BLOQUEAR enquanto o índice está sendo criado. O MySQL é muito, muito estúpido sobre isso (e algumas outras coisas).
Script de teste:
Meu servidor (InnoDB):
Saída (observe como o sexto bloco de operação para os ~ 400ms leva para terminar a atualização do índice):
Vs operações de leitura que não bloqueiam (troque o comentário de linha no script):
Atualizar o esquema do MySQL sem tempo de inatividade
Portanto, há apenas um método que conheço para atualizar um esquema do MySql e não sofrer uma interrupção de disponibilidade. Mestres circulares:
Uma maneira fácil de atualizar o esquema, não é. Viável em um ambiente de produção sério; Sim, ele é. Por favor, por favor, se houver uma maneira mais fácil de adicionar um índice a uma tabela MySQL sem bloquear gravações, me avise.
Googling me levou a este artigo que descreve uma técnica semelhante. Melhor ainda, aconselham beber no mesmo ponto do procedimento (observe que escrevi minha resposta antes de ler o artigo)!
Mudança de esquema pt-online de Percona
O artigo vinculado acima fala sobre uma ferramenta, pt-online-schema-change , que funciona da seguinte maneira:
Nunca experimentei a ferramenta sozinho. YMMV
RDS
Atualmente, estou usando o MySQL por meio do RDS da Amazon . É um serviço realmente bacana que finaliza e gerencia o MySQL, permitindo adicionar novas réplicas de leitura com um único botão e atualizar o banco de dados de forma transparente em todos os SKUs de hardware. É muito conveniente. Você não obtém acesso SUPER ao banco de dados, então não pode atrapalhar a replicação diretamente (isso é uma bênção ou uma maldição?). No entanto, você pode usar Read Replica Promotion para fazer suas alterações de esquema em um escravo somente leitura e, em seguida, promover esse escravo para se tornar seu novo mestre. Exatamente o mesmo truque que descrevi acima, apenas muito mais fácil de executar. Eles ainda não fazem muito para ajudá-lo com a transição. Você tem que reconfigurar e reiniciar seu aplicativo.
fonte
Como esta postagem do blog descreve, o
ALTER TABLE
mecanismo InnoDB foi completamente redesenhado para o MySQL 5.6.(Para uma visão geral exclusiva deste tópico, a documentação do MySQL pode fornecer uma tarde de leitura válida.)
Para adicionar um índice a uma tabela sem um bloqueio resultante em
UPDATE
/INSERT
, o seguinte formato de instrução pode ser usado:fonte
Atualização do MySQL 5.6 (fev 2013): agora você pode executar operações de leitura e gravação enquanto um índice está sendo criado, mesmo com tabelas InnoDB - http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
e:
de http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
fonte
pt-online-schema-change é o caminho a percorrer se você realmente deseja ter certeza de que a migração não derrubará o site.
Como escrevi no comentário acima, tenho várias experiências com pt-online-schema-change em produção. Temos nossa tabela principal de mais de 20 milhões de registros e um mestre -> 2 escravos de replicação somente leitura. Fiz pelo menos uma dúzia de migrações com pt-online-schema-change desde a adição de uma nova coluna, alterando o conjunto de caracteres, até a adição de vários índices. Atendemos muito tráfego durante o período de migração também e não tivemos nenhum problema. É claro que você terá que testar todos os scripts completamente antes de executá-los na produção.
Tentei agrupar as alterações em 1 script de modo que pt-online-schema-change só precise copiar os dados uma vez. E tenha muito cuidado ao alterar o nome da coluna, pois você perderá seus dados. No entanto, adicionar um índice deve ser adequado.
fonte
pt-online-schema-change
. É ótimo, mas é um exagero para muitas situações em que os recursos DDL online do MySQL 5.6 + já funcionam bem. Ele também tem limitações (como não brincar bem com triggers) e dobra a quantidade de escrita necessária por inserção na tabela original enquanto uma mudança de esquema está em andamento. Isso sobrecarregará seu disco significativamente mais do que uma alteração de esquema on-line comum e, portanto, tem o potencial de "derrubar seu site" em circunstâncias em que apenas executar a alteração de esquema de forma simples funcionaria bem.pt-online-schema-change
seja uma ferramenta útil, existem muitas situações em que o DDL online comum é tão bom e um punhado onde é melhor, então qualquer recomendação deve ser cuidadosamente advertida em vez de universal.