Melhores práticas de backup para bancos PostgreSQL
Estratégias essenciais para garantir a segurança dos seus dados em produção.
Por que backups são críticos?
Backups são a última linha de defesa contra perda de dados. Falhas de hardware, erros humanos, bugs em aplicações e ataques maliciosos podem comprometer seus dados a qualquer momento. Uma estratégia de backup bem planejada pode literalmente salvar sua empresa de um desastre.
1. Tipos de backup no PostgreSQL
pg_dump e pg_dumpall (Backup Lógico)
Ideal para bancos pequenos e médios. Gera um arquivo SQL ou binário com todos os dados:
-- Backup de um banco específico (formato custom)
pg_dump -U postgres -d meudb -F c -f backup.dump
-- Backup em SQL puro
pg_dump -U postgres -d meudb -f backup.sql
-- Backup de todos os bancos
pg_dumpall -U postgres -f backup_all.sql
-- Restauração
pg_restore -U postgres -d meudb backup.dump
Backup Físico (PITR - Point-in-Time Recovery)
Para bancos grandes e recuperação granular no tempo. Permite voltar para qualquer momento específico:
-- Configure no postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'cp %p /backup/archive/%f'
max_wal_senders = 3
-- Inicie um backup base
SELECT pg_start_backup('backup-label');
-- Copie todos os arquivos do diretório data
-- rsync -av /var/lib/postgresql/data /backup/base/
-- Finalize o backup
SELECT pg_stop_backup();
2. A Estratégia 3-2-1
A regra de ouro para backups seguros:
- 3 cópias dos dados: Produção + 2 backups
- 2 mídias diferentes: Ex: SSD local + Cloud Storage
- 1 cópia off-site: Em localização física diferente (outra região/datacenter)
3. Automação de backups
Script de backup automatizado
#!/bin/bash
# backup-postgres.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/postgres"
DB_NAME="meudb"
DB_USER="postgres"
RETENTION_DAYS=7
# Cria diretório se não existir
mkdir -p $BACKUP_DIR
# Executa backup
pg_dump -U $DB_USER -d $DB_NAME -F c -f "$BACKUP_DIR/backup_$DATE.dump"
# Verifica se backup foi bem-sucedido
if [ $? -eq 0 ]; then
echo "✅ Backup realizado com sucesso: backup_$DATE.dump"
# Remove backups antigos (mais de 7 dias)
find $BACKUP_DIR -name "backup_*.dump" -mtime +$RETENTION_DAYS -delete
# Upload para S3 (opcional)
aws s3 cp "$BACKUP_DIR/backup_$DATE.dump" s3://meu-bucket/backups/
else
echo "❌ Erro no backup!"
exit 1
fi
Agendamento com cron
# Edite o crontab
crontab -e
# Backup diário às 2h da manhã
0 2 * * * /scripts/backup-postgres.sh >> /var/log/backup.log 2>&1
# Backup a cada 6 horas
0 */6 * * * /scripts/backup-postgres.sh
# Backup semanal completo (domingo 3h)
0 3 * * 0 /scripts/backup-full.sh
4. Testes de restauração
⚠️ Regra de ouro: Backup não testado = backup inexistente!
Teste seus backups regularmente para garantir que funcionam quando você realmente precisar:
-- 1. Crie um banco de teste
createdb test_restore
-- 2. Restaure o backup
pg_restore -U postgres -d test_restore backup.dump
-- 3. Verifique a integridade dos dados
psql -U postgres -d test_restore -c "SELECT count(*) FROM tabela_critica;"
psql -U postgres -d test_restore -c "SELECT * FROM usuarios LIMIT 10;"
-- 4. Teste queries importantes
psql -U postgres -d test_restore -c "SELECT * FROM pedidos WHERE status = 'pendente';"
-- 5. Limpe o banco de teste
dropdb test_restore
Checklist de teste de backup
- ✅ Backup completo e sem erros
- ✅ Restauração funciona 100%
- ✅ Todas as tabelas presentes
- ✅ Contagem de registros correta
- ✅ Índices funcionando
- ✅ Constraints ativas
- ✅ Functions e procedures OK
- ✅ Triggers funcionando
5. Monitoramento de backups
Configure alertas para detectar problemas rapidamente:
Métricas para monitorar
- 🔴 Falha no processo de backup → Alerta crítico imediato
- 🟡 Tamanho anormal do backup → Possível corrupção ou mudança drástica
- 🟡 Tempo de backup muito longo → Pode indicar problema de performance
- 🔴 Espaço em disco insuficiente → Backup pode falhar
- 🟡 Backup não executado no horário → Verificar agendamento
Script de verificação
#!/bin/bash
# check-backup.sh
BACKUP_DIR="/backup/postgres"
ALERT_EMAIL="admin@empresa.com"
MAX_HOURS=25 # Alerta se último backup > 25h
# Verifica último backup
LAST_BACKUP=$(ls -t $BACKUP_DIR/*.dump | head -1)
BACKUP_AGE=$(($(date +%s) - $(stat -c %Y "$LAST_BACKUP")))
HOURS=$((BACKUP_AGE / 3600))
if [ $HOURS -gt $MAX_HOURS ]; then
echo "⚠️ Último backup tem $HOURS horas!" | mail -s "ALERTA: Backup PostgreSQL" $ALERT_EMAIL
fi
6. Estratégias avançadas
Backup incremental com WAL
Economize espaço e tempo com backups incrementais:
-- Configure archive_command para salvar WAL files
archive_command = 'test ! -f /backup/wal/%f && cp %p /backup/wal/%f'
-- Backup base mensal + WAL diário
-- Permite restaurar para qualquer ponto no tempo
Retenção inteligente
# Política de retenção
- Diário: últimos 7 dias
- Semanal: últimas 4 semanas
- Mensal: últimos 12 meses
- Anual: últimos 7 anos
7. CloudPG: Backups gerenciados
No CloudPG, backups são automáticos desde o dia 1:
- ✅ FREE: Backups diários com retenção de 7 dias
- ✅ BASIC: Backups a cada 6h + retenção 14 dias
- ✅ PRO: PITR (Point-in-Time) + retenção 30 dias
- ✅ GIGA: PITR + retenção configurável até 365 dias
Recursos inclusos
- 🔒 Encriptação automática de backups (AES-256)
- ☁️ Armazenamento redundante em múltiplas zonas
- 🔄 Restauração com 1 clique via dashboard
- ✅ Testes automáticos de integridade semanais
- 📊 Monitoramento e alertas integrados
- 📞 Suporte 24/7 para recuperação de desastres
Conclusão
Uma estratégia de backup robusta é essencial para qualquer aplicação em produção. Siga as melhores práticas:
- ✅ Automatize os backups
- ✅ Use a regra 3-2-1
- ✅ Teste restaurações regularmente
- ✅ Monitore e alerte falhas
- ✅ Documente procedimentos
- ✅ Treine a equipe
Lembre-se: Não é "se" você vai precisar de um backup, mas "quando".
Próximos passos
Crie uma instância CloudPG e tenha backups automáticos, seguros e testados configurados desde o primeiro minuto, sem necessidade de scripts ou configurações manuais.