Migrações que não quebram a produção

Uma migração roda perfeitamente na sua máquina. Você faz o deploy em uma sexta-feira às 18h porque parece algo pequeno. Então, o deploy trava. Ou pior, uma tabela com 8 milhões de linhas trava por 40 segundos e seu site cai.

Migrações se comportam de forma diferente em produção. Bancos de dados locais estão vazios e são rápidos. Bancos de dados de produção têm dados reais e usuários ativos.

Siga estas regras para evitar desastres em produção.

  • Sempre escreva um método down funcional Toda migração precisa de uma função up e uma down. A função down deve reverter a função up exatamente. Se você não consegue escrever um rollback, sua migração é complexa demais. Teste-a em sua máquina com migrate seguido de migrate:rollback antes de fazer o push.

  • Nunca edite migrações antigas Você pode querer corrigir o tamanho de uma coluna em um arquivo de migração antigo. Não faça isso. O Laravel não executará esse arquivo novamente no servidor. Em vez disso, crie uma nova migração para alterar a estrutura. Uma migração é um histórico de mudanças. Você adiciona novos capítulos em vez de reescrever os antigos.

  • Use valores nullable ou padrões Adicionar uma coluna NOT NULL a uma tabela com dados existentes causa erros. O banco de dados não sabe o que colocar nas linhas antigas.

Use estas abordagens em vez disso: • Torne a nova coluna nullable. • Defina um valor padrão (default). • Se a coluna for obrigatória, faça em três etapas: crie-a como nullable, preencha os dados e, então, altere para NOT NULL.

  • A perda de dados é permanente O comando dropColumn deleta dados para sempre. Um rollback pode recriar uma coluna, mas os dados dentro dela se foram. Antes de deletar uma coluna, verifique seus backups. Uma maneira mais segura é parar de usar a coluna no seu código primeiro, esperar algumas semanas e depois removê-la do banco de dados.

  • Separe mudanças de esquema de atualizações de dados Executar User::all() dentro de uma migração pode carregar milhões de linhas na memória e travar seu deploy. Se você precisar atualizar dados durante uma migração, use chunkById para processar os registros em pequenos lotes.

  • Use a flag --force em pipelines Pipelines de deploy automatizados ficarão travados se o Laravel pedir confirmação. Use este comando em seus scripts de deploy: php artisan migrate --force

  • Cuidado com bloqueios de tabela Alterar uma coluna ou adicionar um índice em uma tabela massiva bloqueia essa tabela. Isso causa tempo de inatividade (downtime). Para tabelas muito grandes, pesquise sobre ferramentas de alteração de esquema online (online schema change tools) ou execute as mudanças durante horários de baixo tráfego.

Checklist antes do push: • O método down funciona? • Eu testei o rollback localmente? • Estou criando uma nova migração em vez de editar uma antiga? • A nova coluna é nullable ou possui um valor padrão? • Eu tenho um backup antes de deletar colunas?

Source: https://dev.to/denisgusto1/migrations-que-nao-quebram-em-producao-o-guia-que-ninguem-te-deu-363o