Backup e restore com pg_dump e pg_restore
1. Introdução aos Conceitos de Backup no PostgreSQL
A integridade dos dados é um dos pilares mais críticos em qualquer sistema de banco de dados. Em ambientes PostgreSQL, a perda de dados pode ocorrer por falhas de hardware, erros humanos, corrupção lógica ou ataques cibernéticos. Por isso, dominar ferramentas de backup e restore é essencial para qualquer profissional de banco de dados.
O PostgreSQL oferece duas abordagens principais de backup:
- Backup lógico (via
pg_dumpepg_restore): exporta comandos SQL que recriam objetos e dados. É portável entre versões e arquiteturas, mas mais lento em bases muito grandes. - Backup físico (via
pg_basebackup): copia os arquivos do banco no nível do sistema operacional. Ideal para bases enormes, mas menos flexível para restauração seletiva.
O ecossistema de backup lógico inclui três ferramentas principais:
- pg_dump: exporta um banco de dados específico
- pg_dumpall: exporta todos os bancos mais objetos globais (roles, tablespaces)
- pg_restore: restaura backups criados em formatos não-plain (custom, directory, tar)
2. pg_dump: Exportando Dados e Esquemas
A sintaxe básica do pg_dump é direta, mas seus parâmetros oferecem enorme flexibilidade:
pg_dump -h localhost -p 5432 -U usuario -d nome_banco > backup.sql
Parâmetros essenciais:
- -h ou --host: servidor do banco
- -p ou --port: porta de conexão
- -U ou --username: usuário do banco
- -d ou --dbname: nome do banco a ser exportado
Formatos de saída:
-
Plain SQL (
-F p): arquivo texto com comandos SQL. Pode ser restaurado compsql, mas não suporta restauração seletiva viapg_restore. -
Custom (
-F c): formato binário comprimido (.dump). Permite restauração seletiva e paralela. -
Directory (
-F d): cria um diretório com múltiplos arquivos. Excelente para paralelismo. -
Tar (
-F t): similar ao custom, mas em formato tar.
Opções avançadas:
# Apenas esquema (sem dados)
pg_dump -U admin -d vendas --schema-only > esquema_vendas.sql
# Apenas dados (sem DDL)
pg_dump -U admin -d vendas --data-only > dados_vendas.sql
# Tabela específica
pg_dump -U admin -d vendas --table=clientes > clientes_backup.sql
# Excluir tabelas
pg_dump -U admin -d vendas --exclude-table=logs_auditoria > backup_parcial.sql
3. Estratégias de Backup com pg_dump
Backup completo:
pg_dump -U admin -d ecommerce -F c -f ecommerce_completo.dump
Backup seletivo de esquemas:
pg_dump -U admin -d erp --schema=vendas --schema=estoque -F c -f modulo_comercial.dump
Backup com compressão e paralelismo:
# Compressão nível 9 (máxima)
pg_dump -U admin -d analytics -F c -Z 9 -f analytics_comprimido.dump
# Paralelismo com formato directory (4 jobs)
pg_dump -U admin -d analytics -F d -j 4 -f /backup/analytics_paralelo/
O paralelismo (-j ou --jobs) acelera drasticamente backups de bases grandes, dividindo a exportação entre múltiplas tabelas simultaneamente. O formato directory é obrigatório para essa funcionalidade.
4. pg_restore: Restaurando a Partir de um Backup
O pg_restore é a ferramenta para restaurar backups nos formatos custom, directory e tar.
Restauração básica:
# Criar banco vazio primeiro
createdb -U admin ecommerce_restaurado
# Restaurar backup custom
pg_restore -U admin -d ecommerce_restaurado ecommerce_completo.dump
Restauração seletiva:
# Listar conteúdo do backup
pg_restore -l ecommerce_completo.dump > lista_itens.txt
# Restaurar apenas esquema específico
pg_restore -U admin -d ecommerce_restaurado --schema=vendas ecommerce_completo.dump
# Restaurar tabela específica
pg_restore -U admin -d ecommerce_restaurado --table=clientes ecommerce_completo.dump
Controle de concorrência:
# Restauração paralela (4 jobs)
pg_restore -U admin -d ecommerce_restaurado -j 4 ecommerce_completo.dump
# Restauração em transação única (tudo ou nada)
pg_restore -U admin -d ecommerce_restaurado --single-transaction ecommerce_completo.dump
A opção --single-transaction é crucial para manter a consistência: se algo falhar, todo o restore é revertido.
5. Backup e Restore com pg_dumpall
O pg_dumpall é a ferramenta para backup de objetos globais e múltiplos bancos:
# Backup completo de todos os bancos + objetos globais
pg_dumpall -U admin -f backup_completo.sql
# Backup apenas de objetos globais (roles, tablespaces)
pg_dumpall -U admin --globals-only > objetos_globais.sql
Quando usar pg_dumpall:
- Para migrar todo o cluster PostgreSQL
- Para preservar roles, permissões e tablespaces
- Em ambientes com múltiplos bancos pequenos
Limitações importantes:
- Saída apenas em formato plain SQL (não suporta formatos custom/directory)
- Não permite paralelismo
- Restauração lenta em bases muito grandes
Para ambientes de produção com bases grandes, a estratégia recomendada é:
1. pg_dumpall --globals-only para objetos globais
2. pg_dump individual para cada banco (em formato custom com paralelismo)
6. Boas Práticas e Automação
Script de backup automatizado com cron:
#!/bin/bash
# backup_postgres.sh
DATA=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/backup/postgres"
DB_NAME="producao"
# Backup custom com compressão
pg_dump -U admin -d $DB_NAME -F c -Z 9 \
-f "$BACKUP_DIR/${DB_NAME}_${DATA}.dump"
# Backup dos objetos globais (semanal)
if [ $(date +%u) -eq 7 ]; then
pg_dumpall -U admin --globals-only \
-f "$BACKUP_DIR/globals_${DATA}.sql"
fi
# Remover backups com mais de 30 dias
find $BACKUP_DIR -name "*.dump" -mtime +30 -delete
Verificação de integridade:
# Testar backup com pg_restore (modo list)
pg_restore -l backup.dump > /dev/null && echo "Backup íntegro" || echo "Backup corrompido"
# Restauração de teste em banco separado
createdb -U admin teste_restore
pg_restore -U admin -d teste_restore backup.dump
dropdb -U admin teste_restore
Estratégias de armazenamento:
- Mantenha backups em locais geograficamente distintos
- Utilize compressão (nível 5-9 para equilíbrio entre tamanho e performance)
- Implemente rotação automática (retenção de 7-30 dias conforme política)
7. Cenários de Recuperação e Troubleshooting
Restauração em caso de corrupção parcial:
# Restaurar ignorando erros de integridade referencial
pg_restore -U admin -d recuperado --disable-triggers \
--data-only backup.dump
# Reaplicar constraints depois
pg_restore -U admin -d recuperado --schema-only backup.dump
Migração entre versões do PostgreSQL:
# pg_dump na versão antiga (9.6)
pg_dump -U admin -d antigo -F c -f migracao.dump
# pg_restore na versão nova (16)
pg_restore -U admin -d novo migracao.dump
O backup lógico é a única forma segura de migrar entre versões major do PostgreSQL.
Erros comuns e soluções:
| Erro | Causa | Solução |
|---|---|---|
permission denied |
Usuário sem privilégios | Conceder permissões ou usar superusuário |
version mismatch |
Versões incompatíveis | Usar pg_dump da versão do servidor |
encoding mismatch |
Conflito de charset | Especificar --encoding=UTF8 |
role does not exist |
Role não existe no destino | Criar role ou usar --no-owner |
# Solução para conflitos de encoding
pg_dump -U admin -d banco --encoding=UTF8 -f backup_utf8.sql
# Ignorar proprietários durante restore
pg_restore -U admin -d banco --no-owner backup.dump
O backup e restore com pg_dump e pg_restore são habilidades fundamentais para administradores de PostgreSQL. Dominar essas ferramentas garante não apenas a segurança dos dados, mas também a capacidade de realizar migrações, recuperações seletivas e automação de processos. Lembre-se: um backup que nunca é testado não é um backup — é apenas uma esperança.
Referências
- Documentação Oficial do PostgreSQL: pg_dump — Referência completa com todos os parâmetros e exemplos de uso do pg_dump
- Documentação Oficial do PostgreSQL: pg_restore — Guia detalhado sobre restauração de backups com pg_restore
- Documentação Oficial do PostgreSQL: pg_dumpall — Documentação específica para backup de clusters completos e objetos globais
- PostgreSQL Wiki: Backup and Restore — Guia comunitário com estratégias avançadas e cenários reais de backup
- Tutorial DigitalOcean: How To Backup and Restore a PostgreSQL Database — Tutorial prático com exemplos passo a passo para iniciantes e intermediários
- PostgreSQL Tutorial: Backup and Restore — Guia didático com exemplos de backup seletivo e automação