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

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:

Conclusão

Migração zero-downtime é totalmente viável com PostgreSQL. Os passos chave são:

  1. ✅ Planeje meticulosamente
  2. ✅ Use replicação lógica
  3. ✅ Monitore constantemente
  4. ✅ Valide tudo duas vezes
  5. ✅ 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.