postgres postgresql dump pg_dump pg_dumpall
Um dump é uma foto lógica (objetos, schemas, dados) do estado do seu banco em um momento do passado. Eles contêm instruções de reconstrução daquele estado, incluindo possivelmente definições de objetos, dados, usuários e permissões.
ATENÇÃO! Dumps não são propriamente backups e não devemos depender deles para fins de confiabilidade ou continuidade de negócio porque além da grande quantidade de locks que eles exigem para serem extraídos e do alto tempo de restauração necessário para restaurá-los, eles também não atendem a maioria dos casos em que temos RPO (Recovery Point Objective), causando uma perda de dados maior que o aceitável.
O PostgreSQL tem duas ferramentas para geração de dumps: pg_dump e
pg_dumpall. A primeira conecta a um banco de dados específico e gera o dump
sobre os objetos e dados apenas daquele banco. Contudo, além de não tocar em
outros bancos de dados, ela também não exporta objetos globais, como papéis e
definições de tablespaces. A segunda ferramenta tem a finalidade de exportar
múltiplos bancos de dados, assim como os objetos globais.
Além dos parâmetros de conexão comuns (vistos no psql), o pg_dump e
pg_dumpall têm uma vasta gama de parâmetros que podem ser usados para
controlar o conteúdo e a forma da extração.
Parâmetros de controle da saída:
-
-F <fmt>: formato texto (pouplain, padrão), tar (toutar), diretório (doudirectory) ou custom (coucustom, próprio do PostgreSQL) -
-j <N>: número de processos fazendo a extração em paralelo (apenas para o formatodirectory) -
-f <arq>: arquivo/diretório de destino (quando não informado, é usada a saída padrão) -
-E <enc>: codificação de texto -
-Z 0..9: comprime a saída (formatoscustomedirectoryjá são comprimidos por padrão; formatotarnão pode ser comprimido) - …
Parâmetros de controle do conteúdo extraído:
-
-a: apenas DML com dados, omitindo DDL de estruturas -
-s: apenas DDL de estruturas, omitindo DML com dados -
-t <tabela>: apenas as tabelas listadas -
-T <tabela>: todas as tabelas exceto as listadas -
-n <schema>: apenas os schemas (namespaces) listados -
-N <schema>: todos os schemas (namespaces) exceto os listados -
-B: omite large objects (blobs) -
-O: omite atribuições de donos de objetos (owners) -
-x: omite atribuições de privilégios (GRANTs) -
-C: adiciona um comando deCREATE DATABASEpara a restauração -
-c: adiciona um comando deDROP DATABASEpara a restauração (use com cuidado) - …
Parâmetros específicos do pg_dumpall:
-
-g: apenas objetos globais, como papéis e tablespaces -
-r: apenas papéis -
-t: apenas tablespaces
Quando usamos o formato padrão (sem informar o -F ou informando -Fp), a
saída é um texto puro que pode ser alimentado diretamente ao psql para
execução.
Por exemplo, extraindo um dump de um banco origem e importando em um banco
destino:
[postgres@pg-1 ~]$ pg_dump -d origem -f meubd.pgdump [postgres@pg-1 ~]$ file meubd.pgdump meubd.pgdump: UTF-8 Unicode text [postgres@pg-1 ~]$ psql -d destino -f meubd.pgdump
Também é possível comprimir a saída:
[postgres@pg-1 ~]$ pg_dump -d origem -f meubd.pgdump -Z 9 [postgres@pg-1 ~]$ file meubd.pgdump meubd.pgdump: gzip compressed data, max compression, from Unix, original size modulo 2^32 7604 [postgres@pg-1 ~]$ gunzip meubd.pgdump | psql -d destino
Quando usamos outros formatos, a restauração precisa ser feita por um programa
específico chamado pg_restore.
Por exemplo, com o formato custom:
[postgres@pg-1 ~]$ pg_dump -d origem -f meubd.pgdump -Fc [postgres@pg-1 ~]$ file meubd.pgdump meubd.pgdump: PostgreSQL custom database dump - v1.15-0 [postgres@pg-1 ~]$ pg_restore -d destino meubd.pgdump
A restauração pelo pg_restore tem diversas vantagens. Uma delas é a de que o
conteúdo a ser restaurado pode ser filtrado nesse momento, da mesma forma como
na criação do dump, o que dá mais flexibilidade aos usos futuros. Por exemplo,
um dump em formato custom pode conter todas as tabelas com dados; mas na
restauração podemos importar apenas a estrutura deles (-s) ou apenas um
schema (-n) ou usar outros filtros adequados à situação (mesmos filtros do
pg_dump). Outra é a possibilidade de importação em paralelo (j). Ambas não
são possíveis quando usamos o formato de texto simples.
O pg_restore também pode ser usado para listar o conteúdo dos dumps:
[postgres@pg-1 ~]$ pg_restore -l meubd.pgdump ; ; Archive created at 2024-05-27 11:52:05 -03 ; dbname: tureba ; TOC Entries: 5 ; Compression: gzip ; Dump Version: 1.15-0 ; Format: CUSTOM ; Integer: 4 bytes ; Offset: 8 bytes ; Dumped from database version: 16.3 ; Dumped by pg_dump version: 16.3 ; ; ; Selected TOC Entries: ; […] [postgres@pg-1 ~]$
Ele também pode ser usado para converter dumps para texto, para inspecionarmos ou alterarmos comandos antes de importá-los:
[postgres@pg-1 ~]$ pg_restore -f - meubd.pgdump -- -- PostgreSQL database dump -- -- Dumped from database version 16.3 -- Dumped by pg_dump version 16.3 […] -- -- PostgreSQL database dump complete -- [postgres@pg-1 ~]$
ATENÇÃO: Dumps gerados por um pg_dump não são necessariamente compatíveis com
versões mais antigas de servidor e de pg_restore. É necessário que as versões
dos PostgreSQL de origem, do pg_dump (e pg_dumpall), do pg_restore (ou psql) e
do PostgreSQL de destino sigam uma ordem não decrescente:
PostgreSQL (origem) <= pg_dump <= pg_restore <= PostgreSQL (destino)
Ou seja, essa sequência de versões está correta:
13 (origem) <= 13 <= 16 <= 16 (destino)
Mas essa sequência causará problemas:
13 (origem) <= 16 <= 16 !!! 13 (destino)
-
Crie um banco de dados novo, chamado
pagila. -
Baixe os arquivos
pagila-schema.sqlepagila-data.sqlde Pagila. Eles são dois dumps, o primeiro do schema e o segundo dos dados. - Importe os arquivos no banco de dados.
- Valide os objetos no banco de dados e o conteúdo deles com SELECTs e metacomandos.
- Exporte um novo dump em formato custom.
-
Destrua e recrie o banco de dados
pagila. - Importe o novo dump, de formato custom, mas apenas o schema.
- Valide os objetos no banco de dados e o conteúdo deles com SELECTs e metacomandos.