pg_dump -h host -U postgres -d shop -Fc -f shop.dump tira um dump comprimido que pg_restore -d shop_copy shop.dump coloca de volta. Antes que nada disso funcione, o cliente precisa ser pelo menos tão novo quanto o servidor: um pg_dump mais antigo recusa de saída, e esse único erro é o motivo mais comum de o backup nunca acontecer.
1. O erro que trava tudo
$ clai faça um dump do banco shop no servidor pg17→ pg_dump -h pg17 -U postgres -d shoppg_dump: error: aborting because of server version mismatchpg_dump: detail: server version: 17.10; pg_dump version: 16.14 (Debian 16.14-1.pgdg13+1)
Nenhuma flag resolve. É preciso um cliente da versão certa — o pacote postgresql-client-17, ou simplesmente a mesma imagem de contêiner do servidor. O contrário é tranquilo: um cliente mais novo faz o dump de um servidor mais antigo sem reclamar.
2. Um dump em formato custom, não um .sql
$ clai faça o dump do banco shop em um arquivo binário→ pg_dump -h pg17 -U postgres -d shop -Fc -f shop.dump
-Fc grava um arquivo comprimido que o pg_restore consegue abrir seletivamente e carregar em paralelo com -j. Um .sql simples não faz nenhum dos dois: entra inteiro e em ordem pelo psql.
3. Olhe dentro antes de restaurar
$ clai mostre o que tem dentro do dump→ pg_restore -l shop.dump218; 1259 16386 TABLE public orders postgres217; 1259 16385 SEQUENCE public orders_id_seq postgres3427; 0 0 SEQUENCE OWNED BY public orders_id_seq postgres3271; 2604 16389 DEFAULT public orders id postgres3420; 0 16386 TABLE DATA public orders postgres
É o índice do arquivo. Salve num arquivo, apague as linhas que não quer e devolva com -L — é assim que se faz restauração seletiva de verdade.
4. Restaurar em outro banco
$ clai restaure o dump no banco shop_copy→ pg_restore -h pg17 -U postgres -d shop_copy shop.dump
O banco precisa existir antes — createdb shop_copy — porque sem -C o pg_restore não o cria. Quando dá certo o comando não diz nada, então confira com um select count(*).
5. Uma tabela, só os dados
$ clai exporte só a tabela orders sem o esquema→ pg_dump -h pg17 -U postgres -d shop -t orders --data-only -f orders-data.sql
-t restringe a um objeto e --data-only tira o CREATE TABLE. Serve quando a tabela de destino já existe no mesmo formato e faltam apenas as linhas.
6. Restaurar sobre um banco que não está vazio
$ clai restaure o dump por cima do banco existente→ pg_restore -h pg17 -U postgres -d shop_copy --clean --if-exists shop.dump
Sem --clean o mesmo dump falha na segunda vez com pg_restore: error: could not execute query: ERROR: relation "orders" already exists. --clean derruba os objetos antes de recriá-los, e --if-exists silencia os drops do que ainda não existe.
Gotchas
- Cliente mais antigo não faz dump de servidor mais novo. Verificado: pg_dump 16.14 contra um servidor 17.10 para na hora. Mantenha o cliente pelo menos tão novo quanto o servidor; com contêineres o caminho fácil é rodar o pg_dump da mesma imagem do servidor.
pg_restore -tacrescenta, não substitui. Restaurar uma tabela num banco onde ela já tem linhas devolveERROR: duplicate key value violates unique constraint "orders_pkey". Primeiro truncate, depois restore.pg_restoresai com 0 mesmo depois de erros. Verificado: num conflito de chave ele imprimiu o erro e ainda assim retornou código 0. Em scripts use--exit-on-error, senão uma restauração quebrada parece bem-sucedida.
Related questions
Como faço dump só do esquema? pg_dump --schema-only dá a estrutura sem linhas. --data-only é o espelho.
O que restaura um dump .sql? psql -d banco -f dump.sql. O pg_restore só entende os formatos -Fc, -Fd e -Ft; texto puro não é um deles.
Como acelero uma restauração grande? pg_restore -j 4 carrega dados e cria índices em paralelo. Funciona apenas com os formatos custom e directory.
See also
- Logs do Docker enchendo o disco
- Recuperar espaço em disco do Docker
- Extrair qualquer arquivo compactado
O CliAI escreve as linhas de dump e restore com as flags certas para a tarefa, e mostra as duas antes que qualquer uma encoste no seu banco. Instale em uma linha.