J'ai utilisé pg_dump sur une machine et copié le fichier de résultats sur 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
Qu'est-ce qui ne va pas?
Vous êtes en train de vider au format sql ordinaire qui a été conçu pour être alimenté en psql. Ceci n'est pas reconnu par pg_restore.
cat db.txt | psql dbname
devrait faire l'affaire
pg_dump
cré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_restore
ne doit être utilisé que pour le binaire (pas par défaut, et moins habituel non recommandé) format de pg_dump
. Lisez le docs .
Mise à jour: le pg_dump
formats binaires (-Fc
-Ft
) à utiliser avec pg_restore
sont ok et offrent une flexibilité supplémentaire. Mais ils sont moins standard (non SQL), moins aptes à importer à partir de certains outils (par exemple un frontend 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 m'en tiendrai au format standard par défaut. Pour d'autres scénarios, l'option binaire + pg_restore peut être également ou plus appropriée.
Le point à garder est que dans Postgresql, dans le scénario typique , la sauvegarde se fait normalement par pg_dump (plain) et la restauration avec le client de ligne de commande standard ( psql ).
Essayez de passer le --format=c
option pour pg_dump
. Cela permettra à pg_restore
pour le restaurer.
Voici ce que je ferais pour sauvegarder mon ancienne base de données et 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
Pour les utilisateurs de Windows, essayez
type db.txt | psql --username="YOURNAME" dbname
Fonctionne comme un charme
cat dumpFileName | psql -h ip -d nom_base -U nom_utilisateur -W
Vous pouvez faire quelque chose avec la commande SOURCE
de MySQL:
psql dbname
Ensuite, dans le terminal postgresql:
\i filename
Ce message d'erreur peut également signifier qu'il y a en fait quelque chose de mal 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 il a échoué avec does not appear to be a valid archive
. Et en fait, le fichier était vide, car le montage n'a pas été effectué correctement.