pg_dump et pg_restore: le fichier d'entrée ne semble pas être une archive valide

66

J'ai utilisé pg_dump sur une machine et copié le fichier de résultat dans une autre, où j'ai essayé de le restaurer. Je crois que le schéma est le même. Cependant, je reçois:

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

J'ai effectué les opérations suivantes:

pg_dump -a -f db.txt dbname

et:

pg_restore -a -d dbname db.txt

Quel est le problème?

Gruszczy
la source
Essayez d'importer le dump sur le même ordinateur que celui qui l'a généré. Vérifiez également les versions de Postgres.
Hank Gay
Je ne peux pas l'importer sur la même machine, car c'est une machine de production. Une idée, que puis-je faire d'autre?
Gruszczy
Cette solution peut aussi convenir à certaines personnes: stackoverflow.com/questions/42433414/…
Muhammad Hannan

Réponses:

93

Vous effectuez un dumping au format SQL simple, conçu pour alimenter psql. Ceci n'est pas reconnu par pg_restore.

cat db.txt | psql dbname

devrait faire l'affaire

Peter Tillemans
la source
5
ou psql dbname < db.txt;)
Aleksey Deryagin
26

pg_dumpcrée par défaut les commandes SQL nécessaires pour recréer les données. Pour le récupérer, il vous suffit d'appeler psql(pas pg_restore) avec le fichier en entrée. pg_restorene doit être utilisé que pour le format binaire (pas par défaut et moins habituel non recommandé ) pg_dump. Lire la documentation .

Mise à jour: Les pg_dumpformats binaires ( -Fc -Ft) à utiliser avec pg_restoresont acceptables et offrent une flexibilité supplémentaire. Mais ils sont moins standard (non SQL), moins aptes à importer à partir de certains outils (par exemple une interface php) ou à manipuler avec un éditeur de texte, et un peu moins portables vers d’autres versions et même d’autres bases de données. Pour les sauvegardes, je resterais avec le format brut par défaut. Pour les autres scénarios, l'option binary + pg_restore peut être égale ou supérieure.

Le point à garder à l’esprit est que dans Postgresql, dans le scénario typique , la sauvegarde est normalement effectuée par pg_dump (plain) et la restauration avec le client de ligne de commande standard ( psql ).

Leonbloy
la source
2
[OT] Je ne suis pas d'accord sur le statut "non recommandé" du format de sortie personnalisé - la phrase "Ceci est le format le plus flexible en ce sens qu'il permet de réorganiser le chargement de données ainsi que les définitions d'objet ..." du manuel semble pour moi comme tout à fait un endossement.
Milen A. Radev Le
"pas recommandé" était une exagération, je suis d'accord. Mais "plus flexible" ne signifie pas nécessairement "plus recommandé". Clarifié.
leonbloy
13

Essayez de passer l' --format=coption à pg_dump. Cela permettra pg_restorede le restaurer.

psmears
la source
Qui voudrait expliquer cela? La réponse acceptée explique que cela fonctionnera :-)
@skrafi: Quel est votre point de vue?
psmears
1
désolé, copier-coller la mauvaise sortie, la bonne est pg_restore: [archiver] did not find magic string in file headerdonc cela ne fonctionne pas pour simple dump SQL
skrafi
@skrafi: Je ne suis pas sûr de ce que vous voulez dire. Si vous utilisez pg_dump --format=c ...> archivefile, puis utilisez pg_restoreon archivefile, alors (du moins lorsque je l'ai testé tout à l'heure), cela fonctionne bien. Peut-être que votre fichier est corrompu en quelque sorte? Ou vous avez frappé un bug particulier?
psmears
6

C’est ce que je ferais pour sauvegarder mon ancienne base de données et la restaurer.

Pour sauvegarder votre base de données

pg_dump --format=c olddb_name > db_dump_file.dump

Pour restaurer cette sauvegarde

pg_restore -v -d newdb_name db_dump_file.dump

En savoir plus sur pg_dump et pg_restore

Technicien
la source
5

Pour les utilisateurs de Windows, essayez

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

Fonctionne comme un charme


la source
Cela m'a sauvé merci! Devrait être accepté réponse pour Windows au moins.
Daniel Butler
2

Vous pouvez faire quelque chose à la SOURCEcommande de MySQL :

psql dbname

Ensuite, dans le terminal postgresql:

\i filename
greg0ire
la source
2

cat dumpFileName | psql -h ip -d nom_base -U nom_utilisateur -W

Mayank Raipure
la source
1
Il est généralement utile d’expliquer ce que cela fait et pourquoi cela pourrait aider.
Falcon Momot
1

Ce message d'erreur peut également signifier qu'il y a effectivement un problème avec le fichier de sauvegarde (ou vos hypothèses à ce sujet).

Dans un cas, j'avais monté un fichier de sauvegarde dans un conteneur Docker et essayé de restaurer, mais cela a échoué does not appear to be a valid archive. Et en fait, le fichier était vide, car le montage n’avait pas été effectué correctement.

Dag Høidahl
la source