Migração zero-downtime para PostgreSQL gerenciado
Guia completo para migrar seu banco existente sem interrupções.
Por que migração sem downtime é possível e necessária
Migrar bancos de dados em produção costuma assustar equipes técnicas. O medo de perder dados, causar indisponibilidade ou comprometer transações é real. Mas com PostgreSQL e as técnicas certas, é possível migrar sem parar sua aplicação nem por um segundo.
1. Planejamento é tudo
Checklist pré-migração
□ Backup completo do banco origem (CRÍTICO!)
□ Documentar todas as extensions usadas
□ Listar todas as functions, procedures, triggers
□ Mapear usuários e permissões
□ Identificar objetos dependentes (views, etc)
□ Definir janela de manutenção (mesmo que não use)
□ Plano de rollback documentado
□ Ambiente de teste configurado
□ Métricas baseline coletadas
□ Equipe alinhada e disponível
Avaliação do banco
-- Tamanho total
SELECT pg_size_pretty(pg_database_size('meudb'));
-- Taxa de escrita (transações/segundo)
SELECT xact_commit FROM pg_stat_database WHERE datname = 'meudb';
-- Conexões ativas
SELECT count(*) FROM pg_stat_activity;
-- Extensions instaladas
SELECT * FROM pg_extension;
2. Replicação Lógica - A chave do zero-downtime
A replicação lógica do PostgreSQL permite sincronizar dados continuamente entre dois bancos, possibilitando o cutover sem parada:
Configuração no banco origem (source)
-- 1. Edite postgresql.conf
wal_level = logical
max_replication_slots = 4
max_wal_senders = 4
-- 2. Reinicie PostgreSQL
sudo systemctl restart postgresql
-- 3. Crie uma publicação
CREATE PUBLICATION minha_migracao FOR ALL TABLES;
-- Ou para tabelas específicas:
CREATE PUBLICATION minha_migracao FOR TABLE usuarios, pedidos, produtos;
-- 4. Verifique
SELECT * FROM pg_publication;
Configuração no banco destino (CloudPG)
-- 1. Crie o schema (estrutura sem dados)
pg_dump -U postgres -h origem.com -d meudb -s | psql -h cloudpg.com -d meudb
-- 2. Verifique que todas as tabelas existem
\\dt
-- 3. Crie a subscrição (inicia sincronização)
CREATE SUBSCRIPTION minha_migracao
CONNECTION 'host=origem.com port=5432 dbname=meudb user=replicador password=SENHA_SEGURA'
PUBLICATION minha_migracao
WITH (copy_data = true);
-- 4. Monitore o progresso
SELECT * FROM pg_stat_subscription;
SELECT * FROM pg_subscription_rel;
3. Monitoramento da replicação
Queries essenciais
-- Lag de replicação (deve chegar a 0)
SELECT
subname,
received_lsn,
latest_end_lsn,
latest_end_time
FROM pg_stat_subscription;
-- Status de cada tabela
SELECT
srsubid,
srrelid::regclass,
srsubstate,
srsublsn
FROM pg_subscription_rel
ORDER BY srrelid;
Script de monitoramento contínuo
#!/bin/bash
# monitor-replication.sh
while true; do
LAG=$(psql -h cloudpg.com -U postgres -d meudb -t -c "
SELECT EXTRACT(EPOCH FROM (now() - latest_end_time))::int
FROM pg_stat_subscription
WHERE subname = 'minha_migracao'
")
echo "$(date): Lag = $LAG segundos"
if [ "$LAG" -lt 5 ]; then
echo "✅ Replicação sincronizada! Lag < 5s"
break
fi
sleep 10
done
4. O processo de cutover
Preparação final
-- 1. Verifique que lag está em 0
SELECT * FROM pg_stat_subscription;
-- 2. Liste todas as sequences e seus valores
SELECT
schemaname,
sequencename,
last_value
FROM pg_sequences
ORDER BY schemaname, sequencename;
-- 3. Documente conexões ativas
SELECT count(*), application_name
FROM pg_stat_activity
WHERE datname = 'meudb'
GROUP BY application_name;
Execução do cutover (Downtime: 30-60 segundos)
-- PASSO 1: Coloque aplicação em modo read-only (opcional)
-- Ou apenas pause writes temporariamente
-- PASSO 2: Aguarde replicação final
SELECT pg_sleep(10);
-- PASSO 3: Verifique que lag = 0
SELECT * FROM pg_stat_subscription;
-- PASSO 4: Sincronize sequences
-- No origem:
SELECT 'SELECT setval(''' || schemaname || '.' || sequencename || ''', ' || last_value || ');'
FROM pg_sequences;
-- Copie output e execute no destino
-- PASSO 5: Desabilite subscrição
ALTER SUBSCRIPTION minha_migracao DISABLE;
-- PASSO 6: Atualize connection string na aplicação
-- Nova: host=cloudpg.com port=5432 dbname=meudb ...
-- PASSO 7: Teste aplicação
-- Faça alguns testes manuais
-- PASSO 8: Remova subscrição (após 24-48h de validação)
DROP SUBSCRIPTION minha_migracao;
5. Validação pós-migração
Checklist de validação
-- Conte registros em tabelas críticas
SELECT 'usuarios' as tabela, count(*) FROM usuarios
UNION ALL
SELECT 'pedidos', count(*) FROM pedidos
UNION ALL
SELECT 'produtos', count(*) FROM produtos;
-- Compare com origem
-- Números devem ser idênticos ou muito próximos
-- Verifique indexes
SELECT schemaname, tablename, indexname
FROM pg_indexes
WHERE schemaname = 'public'
ORDER BY tablename;
-- Teste queries críticas
EXPLAIN ANALYZE SELECT * FROM pedidos WHERE status = 'pendente';
-- Verifique performance
SELECT * FROM pg_stat_user_tables
ORDER BY seq_scan DESC LIMIT 10;
Testes funcionais
- ✅ Login de usuários funcionando
- ✅ Criar novo registro (INSERT)
- ✅ Atualizar registro (UPDATE)
- ✅ Deletar registro (DELETE)
- ✅ Queries complexas com JOINs
- ✅ Transactions ACID
- ✅ Triggers executando
- ✅ Functions/procedures OK
6. Troubleshooting comum
Problema: Lag de replicação alto
-- Causa: Tabelas muito grandes ou alto volume de escrita
-- Solução 1: Aumente workers
ALTER SUBSCRIPTION minha_migracao
SET (streaming = on, synchronous_commit = off);
-- Solução 2: Replique tabelas grandes separadamente
CREATE PUBLICATION pub_grandes FOR TABLE tabela_enorme;
CREATE SUBSCRIPTION sub_grandes ...
Problema: Conflitos de replicação
-- Identifique conflitos
SELECT * FROM pg_replication_origin_status;
-- Causa comum: Dados já existem no destino
-- Solução: Limpe destino ou use copy_data = false
Problema: Extensions não disponíveis
-- Liste extensions no origem
SELECT * FROM pg_extension;
-- Instale no destino
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
7. Rollback plan
Sempre tenha um plano B:
Se algo der errado:
1. Reverta connection string para origem
2. Aplicação volta a usar banco antigo
3. Investigue o problema com calma
4. Corrija e tente novamente
Tempo de rollback: <30 segundos
8. CloudPG Migration Assistant
O CloudPG oferece assistência completa para migração:
- ✅ Scripts pré-configurados para setup de replicação
- ✅ Dashboard visual do progresso em tempo real
- ✅ Validação automática de integridade dos dados
- ✅ Sincronização de sequences automatizada
- ✅ Checklist interativo passo-a-passo
- ✅ Suporte 24/7 durante todo processo
- ✅ Rollback em 1 clique se necessário
Conclusão
Migração zero-downtime é totalmente viável com PostgreSQL. Os passos chave são:
- ✅ Planeje meticulosamente
- ✅ Use replicação lógica
- ✅ Monitore constantemente
- ✅ Valide tudo duas vezes
- ✅ Tenha plano de rollback
Com CloudPG, você tem suporte especializado em cada etapa, reduzindo riscos e garantindo sucesso.
Comece sua migração
Fale com nosso time e receba um plano de migração personalizado, sem compromisso.