pg_dump e pg_restore: o arquivo de entrada não parece ser um archive válido

66

Eu usei o pg_dump em uma máquina e copiei o arquivo de resultado para outro, onde tentei restaurá-lo. Eu acredito que esquema é o mesmo. No entanto, eu recebo:

pg_restore: [archiver] input file does not appear to be a valid archive

Eu fiz as seguintes operações:

pg_dump -a -f db.txt dbname

e:

pg_restore -a -d dbname db.txt

O que pode estar errado?

gruszczy
fonte
Tente importar o despejo na mesma máquina que o gerou. Além disso, verifique as versões do Postgres.
Hank Gay
Não posso tentar importá-lo na mesma máquina, porque é uma máquina de produção. Alguma idéia, o que mais eu posso fazer?
gruszczy
Esta solução também pode ser relevante para algumas pessoas: stackoverflow.com/questions/42433414/…
Muhammad Hannan

Respostas:

93

Você está despejando no formato sql simples, projetado para alimentar o psql. Isso não é reconhecido pelo pg_restore.

cat db.txt | psql dbname

deve fazer o truque

Peter Tillemans
fonte
5
ou psql dbname < db.txt;) #
Aleksey Deryagin
26

pg_dumppor padrão, cria os comandos sql necessários para recriar os dados. Para recuperá-lo, basta invocar psql(não pg_restore) o arquivo como entrada. pg_restoredeve ser usado apenas para o formato binário (não padrão e menos usual, não recomendado ) de pg_dump. Leia os documentos .

Atualização: Os pg_dumpformatos binários ( -Fc -Ft) a serem usados pg_restoreestão ok e oferecem alguma flexibilidade extra. Mas eles são menos padrão (não SQL), menos aptos para importar de algumas ferramentas (por exemplo, um front-end php) ou manipular com um editor de texto e um pouco menos portável para outras versões e até outros bancos de dados. Para backups, eu continuaria com o formato simples padrão. Para outros cenários, a opção binary + pg_restore pode ser igualmente ou mais adequada.

O ponto a ser mantido é que, no Postgresql, no cenário típico , o backup normalmente é feito por pg_dump (simples) e a restauração com o cliente de linha de comando padrão ( psql ).

leonbloy
fonte
2
[OT] Eu imploro para diferir quanto ao status "não recomendado" do formato de saída personalizado - a frase "Este é o formato mais flexível, pois permite reordenar o carregamento de dados, bem como as definições de objetos ..." do manual parece para mim como um grande endosso.
Milen A. Radev
"não recomendado" foi um exagero, eu concordo. Mas "mais flexível" não significa necessariamente "mais recomendado". Esclarecido.
leonbloy
13

Tente passar a --format=copção para pg_dump. Isso permitirá pg_restorerestaurá-lo.

psmears
fonte
Quem modificou isso gostaria de explicar o porquê? A resposta aceita explica que isso vai funcionar :-)
@skrafi: Qual é o seu ponto?
Psmears #
11
Desculpe, saída errada colado contra cópia, o certo é pg_restore: [archiver] did not find magic string in file headerque isso não funciona para simples despejo sql
skrafi
@skrafi: Não sei ao certo o que você quer dizer. Se você usar pg_dump --format=c ...> archivefile, e então usar pg_restoreem archivefile, em seguida, (pelo menos quando eu testei apenas agora) ele funciona muito bem. Talvez o seu arquivo esteja corrompido de alguma forma? Ou você atingiu um bug específico?
Psmears #
6

Isto é o que eu faria para fazer backup do meu banco de dados antigo e restaurar

Para fazer backup do seu banco de dados

pg_dump --format=c olddb_name > db_dump_file.dump

Para restaurar esse backup

pg_restore -v -d newdb_name db_dump_file.dump

Leia mais sobre pg_dump e pg_restore

Techie
fonte
5

Para usuários do Windows, tente

type db.txt | psql --username="YOURNAME" dbname

Funciona como um encanto


fonte
Isso me salvou, obrigado! Deve ser aceita resposta para janelas, pelo menos.
Daniel Butler
2

Você pode fazer algo com o SOURCEcomando do MySQL :

psql dbname

Em seguida, no terminal postgresql:

\i filename
greg0ire
fonte
2

dumpFileName do gato | psql -h ip -d dbName -U nome_do_usuário -W

Mayank Raipure
fonte
11
Geralmente é útil se você explicar o que isso faz e por que isso pode ajudar.
precisa saber é o seguinte
1

Essa mensagem de erro também pode significar que há realmente algo errado com o arquivo de backup (ou suas suposições).

Em um caso, montei um arquivo de backup em um contêiner do Docker e tentei restaurar, mas ele falhou does not appear to be a valid archive. E, de fato, o arquivo estava vazio, porque a montagem não foi realizada corretamente.

Dag Høidahl
fonte