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?


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


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 ).


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.


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


5

Para usuários do Windows, tente

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

Funciona como um encanto


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.