⌘K

03 – Backups Cirúrgicos no Postgres: Como extrair apenas tabelas, esquemas ou dados específicos

Last updated

Até agora, na nossa série Guia de Sobrevivência: Backup e Manutenção no Postgres, nós aprendemos a escolher o utilitário correto (pg_dump vs pg_dumpall) e vimos como o formato de diretório destrava o paralelismo para acelerar backups gigantes.

Mas e quando você não quer o banco de dados inteiro?

No dia a dia de DevOps, Engenharia de Dados e DBA, existem situações em que clonar gigabytes ou terabytes de dados é um desperdício massivo de tempo e armazenamento. Às vezes, um desenvolvedor precisa apenas da estrutura das tabelas para homologar uma nova feature, ou analista de dados precisa de uma única tabela específica que foi corrompida ou apagada acidentalmente em homologação.

Neste post, vamos aprender a fazer backups cirúrgicos usando as flags de filtragem avançada do pg_dump: -t, -n, -a e -s.

O Cenário Real: O que é um Backup Cirúrgico?

Em vez de usar uma abordagem de “tudo ou nada”, o pg_dump permite que você passe filtros refinados para extrair exatamente o que precisa. Isso economiza banda de rede, espaço em disco e, principalmente, tempo.

Vamos direto aos comandos que salvam plantões.

1. Isolando tabelas específicas (-t ou --table)

Imagine que um processo de carga de dados corrompeu a tabela pedidos_faturamento no ambiente de homologação, mas ela está perfeita em produção. Você não precisa restaurar o banco de 500GB inteiro para corrigir isso. Você só precisa daquela tabela.

Para extrair apenas uma tabela (e seus índices/triggers associados):

Bash

pg_dump -U postgres -h localhost -F c -t public.pedidos_faturamento -f tabela_faturamento.dump meu_banco

O Pulo do Gato: Expressões Regulares (Wildcards)

A flag -t é extremamente poderosa porque aceita o caractere curinga *. Se você quiser fazer o backup de todas as tabelas que começam com o prefixo relatorio_, basta rodar:

Bash

pg_dump -U postgres -h localhost -F c -t "public.relatorio_*" -f tabelas_relatorios.dump meu_banco

2. Separando por Esquemas/Namespaces (-n ou --schema)

Se a sua arquitetura de banco de dados utiliza múltiplos schemas (por exemplo, um esquema para vendas, um para rh e outro para auditoria), você pode isolar um ecossistema inteiro usando a flag -n.

Para extrair apenas o módulo de Recursos Humanos:

Bash

pg_dump -U postgres -h localhost -F c -n rh -f modulo_rh.dump meu_banco

(Nota: Assim como nas tabelas, você também pode usar -n "prefixo_*" para filtrar múltiplos esquemas).

3. O Gancho de Homologação: Estrutura vs. Dados

Aqui estão as duas flags mais utilizadas para preparar ambientes de testes, criar definições para pipelines de CI/CD ou gerar sementes (seeds) de dados.

Apenas a Estrutura, Sem os Dados (-s ou --schema-only)

Você precisa criar um ambiente de homologação idêntico ao de produção, mas por questões de conformidade (LGPD) ou espaço em disco, você não pode levar os dados dos clientes. A flag -s extrai apenas os comandos DDL (CREATE TABLE, CREATE INDEX, views, types, etc.).

Bash

pg_dump -U postgres -h localhost -F p -s -f estrutura_banco.sql meu_banco

Dica: Note que usamos o formato Plain (-F p) aqui. Como é apenas texto com a estrutura, gerar um arquivo .sql limpo facilita muito para o time de desenvolvimento subir o banco localmente via Docker.

Apenas os Dados, Sem a Estrutura (-a ou --data-only)

O cenário inverso: as tabelas já existem no destino, e você quer apenas extrair as linhas (os registros em si) para popular uma tabela de configuração ou parâmetros (ex: tabela de paises ou status_pedido).

Bash

pg_dump -U postgres -h localhost -F p -a -t public.status_pedido -f dados_status.sql meu_banco

Invertendo a Lógica: Como Excluir Objetos (-T e -N)

Às vezes é mais fácil dizer ao Postgres o que você não quer levar. Para isso, basta usar as mesmas flags, mas em letras maiúsculas:

  • -T (Excluir tabela específica)
  • -N (Excluir esquema específico)

Cenário prático: Você quer o backup do banco inteiro, exceto daquela tabela gigante de logs históricos (public.logs_acesso) que ocupa 80% do disco e não é necessária no ambiente de testes:

Bash

pg_dump -U postgres -h localhost -F c -T public.logs_acesso -f backup_sem_logs.dump meu_banco

Resumo de Comandos para o seu Cheat Sheet

O que você quer extrair?Comando / Flag Essencial
Apenas uma tabela específicapg_dump -t esquema.tabela
Um grupo de tabelas parecidaspg_dump -t "esquema.prefixo_*"
Um módulo/esquema inteiropg_dump -n nome_do_esquema
O banco todo, MENOS os logspg_dump -T esquema.tabela_de_logs
Apenas o esqueleto (DDL) para o DEVpg_dump -s
Apenas os registros (DML) de cargapg_dump -a

Conclusão

Dominar essas flags transforma o pg_dump de uma ferramenta bruta de backup em um bisturi de precisão. Em poucos segundos, você consegue extrair exatamente o pedaço de informação necessário para resolver um bug em homologação ou salvar uma tabela corrompida.

Agora que passamos pelas principais estratégias de extração e geração de arquivos, entramos na segunda fase da nossa série. No próximo post, vamos falar sobre o caminho de volta: como dominar o pg_restore para ler esses arquivos binários e gerenciar conflitos de objetos durante a restauração. Até lá!

E você, já precisou extrair apenas uma tabela de produção para salvar o ambiente de homologação? Qual flag te salvou? Escreva nos comentários!

Still stuck? How can we help? Get Help