16 de Junho de 2025
Como Evoluir Schema Sem Derrubar Produção
Como mudar banco, contrato de dado e caminho de leitura sem transformar migration em roleta russa operacional.
Andrews Ribeiro
Founder & Engineer
3 min Intermediario Sistemas
O problema
Tem time que trata mudança de schema assim:
- altera a tabela
- sobe o código novo
- torce
As vezes passa.
As vezes produz exatamente o tipo de incidente chato que parece bobo em retrospecto:
- app antiga lendo coluna que sumiu
- app nova esperando dado que ainda não existe
- rollback impossivel
- dado escrito em formato misto
Schema em produção quebra menos por SQL errado e mais por coordenação ruim.
Modelo mental
Pense assim:
evoluir schema e um problema de compatibilidade temporal
O dado não muda sozinho.
Durante um tempo, coexistem:
- versão antiga do código
- versão nova do código
- dado velho
- dado novo
Se o seu plano não funciona nesse período de convivio, ele ainda esta incompleto.
Quebrando o problema
Primeiro expanda sem quebrar
O passo mais seguro costuma ser adicionar sem remover:
- nova coluna
- novo campo opcional
- nova tabela de apoio
Esse tipo de mudança tende a ser mais compativel com código que ainda não foi atualizado.
Depois faca a aplicação escrever no formato novo
Só adicionar coluna não muda o comportamento.
Você precisa decidir:
- quando começar a gravar no lugar novo
- se vai escrever em dois lugares por um tempo
- como ler durante a transição
Aqui mora boa parte da engenharia.
Migre leitura com cuidado
Leitura costuma ser o ponto mais traicoeiro.
Se o sistema passa a depender exclusivamente do formato novo cedo demais, qualquer dado antigo vira bug.
Por isso e comum:
- ler do novo quando existir
- cair para o velho enquanto a migração acontece
Essa fase parece feia.
Mas geralmente e a feiura correta.
Só remova no fim
Apagar coluna, constraint ou caminho antigo cedo demais e o jeito clássico de transformar rollout em incidente.
Remoção costuma vir por ultimo, depois que:
- escrita nova esta estavel
- leitura nova esta consolidada
- dado antigo foi migrado
- rollback já não depende do formato anterior
Exemplo simples
Imagine que users tem uma coluna full_name e o time quer separar em:
first_namelast_name
Plano ruim:
- remove
full_name - adiciona as novas colunas
- sobe a aplicação nova
Plano melhor:
- adiciona
first_nameelast_name - aplicação passa a escrever nos campos novos sem parar de suportar o antigo
- job migra dados existentes
- leitura passa a preferir campos novos
- só no fim
full_namedeixa de ser necessário
Esse plano parece mais longo.
Na prática, costuma ser bem menos dramatico.
Erros comuns
- Fazer migration destrutiva cedo demais.
- Assumir deploy perfeitamente sincronizado entre todas as instancias.
- Esquecer rollback na hora de mudar o formato de dado.
- Tratar schema como detalhe de banco e não como contrato vivo com a aplicação.
- Mudar leitura e escrita ao mesmo tempo sem fase de transição.
Como um senior pensa
Quem tem mais experiência costuma fazer esta pergunta antes de alterar schema:
“Durante a transição, o que acontece se metade do tráfego estiver no código novo e metade no antigo?”
Se a resposta for “quebra”, o plano ainda esta imaturo.
Senioridade aqui aparece muito mais na orquestração da mudança do que no comando SQL em si.
O que o entrevistador quer ver
Em entrevista, esse tema mede maturidade operacional e de sistema.
O avaliador quer ver se você:
- pensa em compatibilidade temporária
- evita migration destrutiva como primeiro passo
- entende leitura e escrita como partes separadas da transição
- considera rollout e rollback junto com schema
Uma resposta forte costuma soar assim:
“Eu evitaria uma migration que quebra o formato antigo de uma vez. Primeiro expandiria o schema, depois faria a aplicação conviver com velho e novo por um tempo, migraria dados e só no fim removeria o caminho antigo.”
Mudar schema com segurança e mais sobre coreografar convivio do que sobre escrever SQL bonito.
O sistema não quebra quando o schema muda. Ele quebra quando as versões param de conversar.
Resumo rápido
O que vale manter na cabeça
- Evoluir schema com segurança quase sempre exige compatibilidade temporária entre velho e novo.
- Migration técnica sozinha não resolve rollout; leitura e escrita da aplicação também precisam acompanhar.
- Expandir, migrar e depois contrair costuma ser mais seguro do que mudar tudo em um passo.
- O risco real não esta no comando de migration, e no desencontro entre versões de código e formato de dado.
Checklist de pratica
Use isto ao responder
- Consigo explicar por que schema antigo e novo precisam conviver por um tempo?
- Sei diferenciar migration destrutiva de migration expansiva?
- Consigo descrever uma estratégia de expand-migrate-contract?
- Sei responder em entrevista como mudaria schema sem depender de deploy atomico perfeito?
Você concluiu este artigo
Compartilhar esta página
Copie o link manualmente no campo abaixo.