Migração de Banco de Dados: Mudanças de Schema e Deploy sem Downtime
Migração de banco de dados é o processo de aplicar mudanças de schema de forma segura e controlada. Este guia cobre as estratégias de migração, o deploy sem downtime e os planos de rollback.
Atualizado em:O que é Migração de Banco de Dados?
Migração de banco de dados é um processo controlado utilizado para mudar o schema do banco de dados (estruturas de tabelas, índices, restrições).
Mudanças de schema: Adicionar nova tabela, adicionar/modificar/excluir coluna, adicionar índice, adicionar foreign key, mudar tipo de dado.
Riscos: Perda de dados, downtime, degradação de desempenho, incompatibilidade para trás.
Objetivo: Aplicar mudanças de schema de forma segura, repetível e reversível.
Ferramentas de Migração
Flyway: Ferramenta de migração baseada em SQL. Arquivos de migração versionados (V1__create_users.sql). Suporte de Java, Node.js, CLI.
Liquibase: Changelog em formato XML/YAML/JSON/SQL. Suporte de rollback, geração de diff, comparação de bancos de dados.
Prisma Migrate: Integrado com Prisma ORM. Gera automaticamente a migração a partir de schema.prisma.
Knex.js: Ferramenta de migração de Node.js. Arquivos de migração em JavaScript. Funções up e down.
Django/ActiveRecord: Ferramentas de migração integradas no framework. Cria automaticamente a migração a partir de mudanças no modelo.
Estratégias de Migração sem Downtime
Expand and Contract (Parallel Change): 1) Adicionar nova coluna/tabela (expand), 2) Atualizar código (suportar coluna nova e antiga), 3) Remover coluna antiga (contract).
Mudanças compatíveis para trás: Adicionar nova coluna (nullable), adicionar nova tabela, adicionar novo índice. Essas mudanças não requerem downtime.
Mudanças breaking: Exclusão de coluna, mudança de tipo de coluna, rename. Essas mudanças devem ser feitas com o padrão expand-contract.
Feature flags: Coloque o novo schema atrás de feature flag. Reduza o risco com rollout gradual.
Blue-green deployment: Teste o novo schema em ambiente paralelo. Mude o tráfego. Volte ao ambiente anterior se houver problema.
Migração de Dados
Backfill: Faça com que os dados existentes sejam compatíveis com o novo schema. Processe grandes conjuntos de dados com processamento em lote.
Dual write: Escreva tanto no schema antigo quanto no novo. Mantenha a consistência dos dados durante o período de transição.
Validação de dados: Verifique a integridade dos dados após a migração. Contagem de linhas, checksum, comparação de amostra.
Desempenho: A migração em tabelas grandes cria carga de lock e I/O. Execute durante horas de baixo tráfego. Use processamento em chunks.
Plano de Rollback
Down migration: Escreva a down migration correspondente (rollback) para cada up migration. Flyway, Liquibase suportam rollback.
Backup: Faça um backup completo antes da migração. Tenha capacidade de point-in-time recovery (PITR).
Testes: Teste a migração no ambiente de staging. Use o mesmo volume de dados e schema da produção.
Monitoramento: Monitore o desempenho das consultas e a taxa de erro após a migração. Faça rollback se houver desvio anormal.
Comunicação: Compartilhe o plano de migração com a equipe. Defina a janela de manutenção.
Melhores Práticas
Controle de versão: Rastreie os arquivos de migração com Git. Cada migração deve ser atômica (uma única mudança).
Idempotência: Executar a migração várias vezes deve produzir o mesmo resultado. Use IF NOT EXISTS, IF EXISTS.
Migrações pequenas: Divida grandes mudanças em migrações pequenas. Cada migração deve ser implantável independentemente.
Code review: Passe os arquivos de migração pelo code review. Mudanças de schema são críticas e difíceis de reverter.
Documentação: Documente o propósito e o impacto de cada migração. Indique claramente as mudanças breaking.