Olá. Aqui é a Komiya do lado do OPS.
Uma manhã, de repente recebi uma consulta do desenvolvedor, então vou gravar para depois.
Detalhes da consulta:
Fiz uma implantação em produção no Jenkins, mas o processo parou no meio do processo.
(Implantado com o script de migração do banco de dados do Cake)
Tentei colocar o ÍNDICE na coluna CHAVE, mas o banco de dados não respondeu e eu não consegui conectar.
Como resultado, a tabela estava corrompida, então usei a função RDS para especificar o tempo e voltar atrás.
(Não sei se o ALTER acabou porque eu voltei atrás)
Após fazer a mesma operação em um ambiente de teste com o mesmo número de registros, terminou de forma tranquila, sem nenhuma anomalia.
Quero fazer a mesma coisa de novo na vida real, mas o que devo fazer?
A versão do MySQL é 5.5.27.
Minha percepção pessoal:
Normalmente, quando você gira o ALTER, um bloqueio é aplicado,
Estime o tempo que levará antecipadamente em um ambiente de teste com a mesma configuração e número de casos.
Você deveria parar o serviço e fazer manutenção durante esse tempo.
(*Até 5.5.) A partir da 5.6, alguns ALTERs parecem ter ficado OK online. )
Mude para a tela de desculpa e tente em um ambiente sem atualizações.
(Remover toda a web sob o ELB existente, cortar o vhost para a web de outro subdomínio, colocar o conteúdo lamentável no ELB, etc.)
Se você forçar o abandono no meio, parece que a mesa vai quebrar facilmente com o MyISAM.
Mostrar a lista completa de processos; Você pode ver a consulta atual e o tempo que ela leva.
Mas acho que matar é o último recurso.
Você pode descobrir muito pesquisando no Google sobre alterar table, mysql ou plus 5.6.
Se você olhar o blog do SH2, está o seguinte.
Verifique o progresso das instruções ALTER TABLE no MySQL - Diário do SH2
----------------
No MySQL,
Crie uma tabela de trabalho baseada na definição modificada,
Copie os dados da tabela antes da mudança para a tabela de trabalho,
Por fim, as duas mesas são trocadas.
Adicionar índices às tabelas também é atualmente suportado pela maioria dos
A instrução ALTER TABLE está sendo executada internamente no caso.
Como verificar quanto tempo você está dormindo:
MOSTRAR STATUS GLOBAL COMO 'Handler_write';
Se você mantiver o valor do Handler_write e o número de registros na tabela de destino antes de começar o trabalho,
Você pode ver até onde o processo avançou.
Se você usa innotop no InnoDB, há Ins/Sec na visão de operações de linha, então
Da mesma forma, você pode fazer uma previsão da conclusão da TABELA ALTER.
Você não precisa calcular a diferença sozinho, e é uma ferramenta padrão, então é conveniente
----------------
Foi apresentado da seguinte forma no blog da Allied.
Confira os novos recursos do MySQL 5.6! | Allied Architects Engineer Blog
----------------
Melhorou algumas operações ALTER TABLE no InnoDB para evitar bloqueios
Até agora, quando você tentava indexar, o INSERT e UPDATE no meio dele estavam travados.
Durante o serviço, nem conseguimos afinar a apresentação, então tivemos que mantê-la.
A partir da versão 5.6, você pode criar uma ALTER TABLE sem bloquear o DML.
Isso é bastante útil.
No entanto, parece estar limitado às seguintes operações, não todas as ALTER TABLE.
- Adicionar, excluir e renomear colunas
・CREATE e DROP para índices secundários - Alterar o valor do autoincremento
- Adicionar e remover restrições de chave estrangeira
… etc
No entanto, isso é suficiente.
Será muito mais fácil de operar.
----------------
・O que acontece se você matar o ALTER no meio?
MySQL :: Manual de Referência MySQL 5.1 :: 12.5.5.3 Sintaxe KILL
Durante a ALTER TABLE, a flag de eliminação é verificada antes de cada bloco da linha ser lido da tabela original.
Se a flag de kill for ativada, a instrução terminará de forma anormal e a tabela temporária será excluída.
Aviso: Terminar a operação TABELA DE REPARO ou OTIMIZAR TABELA em uma tabela MyISAM corromperá a tabela e a tornará indisponível.
Até que você otimize ou repare (sem interrupções), as escritas e leituras nessas tabelas falharão.
・Efeitos como OPTIMIZE TABLE↓
ANALYZE TABLE Usado para atualizar estatísticas de índice
OPTIMYZE TABLE: o formato de comprimento variável do MyISAM (com colunas de comprimento variável na definição da tabela) e o do InnoDB
Execute para eliminar fragmentação na parte de dados
No caso do MyISAM, as estatísticas do índice são atualizadas, desfragmentadas e as páginas do índice são reordenadas.
No caso do InnoDB, alterar tabela é realizada internamente e a tabela é recriada.
Tanto as informações do índice quanto os dados são recriados para eliminar a desfragmentação.
TABELA DE VERIFICAÇÃO Usada para conferir tabelas que podem estar corrompidas
TABELA DE REPARO Se a corrupção for confirmada, tentará restaurá-la
Quando a tabela ALTER TABLE é recriada, tanto as informações do índice quanto os dados são recriados, eliminando a desfragmentação
・Sobre pt-online-schema-change (referência)
Sem interromper o serviço, Alter Table | Blog dos Engenheiros da C.A.Mobile Se você tem o PerconaToolkit em algum lugar, deveria tentar usá-lo. É uma ferramenta muito útil. Você também pode ver que há uma duplicação do KEY.
Pós-escrito de 13/12:
Por favor, dê uma olhada abaixo também
Caminho do Computador de Han: Vamos dominar bem a TABELA ALTERADA. Falando sobre travamento ao adicionar e excluir colunas e índices no MySQL - (゚∀゚)オ彡 blog do sasata299
É só isso por enquanto.
Obrigado por assistir.