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 (p
ouplain
, padrão), tar (t
outar
), diretório (d
oudirectory
) ou custom (c
oucustom
, 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 (formatoscustom
edirectory
já são comprimidos por padrão; formatotar
nã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 DATABASE
para a restauração -
-c
: adiciona um comando deDROP DATABASE
para 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.sql
epagila-data.sql
de 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.