J'essaie d'exécuter la commande suivante:
sshpass -p "pass" ssh [email protected] "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db
Je reçois:
failed: FATAL: database "new_db" does not exist
C'est parce que c'est la façon dont pg_restore fonctionne.
manuel pg_restore se lit comme suit:
-C, --create Créez la base de données avant de la restaurer. Si --clean est également spécifié, supprimez et recréez la base de données cible avant de vous y connecter.
Lorsque cette option est utilisée, la base de données nommée avec -d est utilisée uniquement pour émettre les commandes DROP DATABASE et CREATE DATABASE initiales . Toutes les données sont restaurées dans le nom de la base de données qui apparaît dans l'archive .
-D sera restauré dans la base de données donnée si et seulement si -C n'est pas utilisé. Si -C est utilisé, la base de données est utilisée comme "tableau de bord", pas comme destination.
En bref, vous voulez soit (nettoyer l'existant): (notez que le nom de la base de données est postgres
)
pg_restore -c -d postgres db.dump
ou (créer un nouveau)
pg_restore -C -d postgres db.dump
ou (créez un nouveau explicitement)
createdatabase the_database
pg_restore -d the_database db.dump
Voir ce que SCO a dit pour plus de détails.
Pour être un peu plus explicite, voici ce que j'ai fait qui a résolu le problème pour moi:
Créez une base de données vide avec le nom que vous voulez: (dans mon cas, le nom d'utilisateur était "postgres")
psql -U [username]
Il vous demandera alors votre mot de passe. À ce stade, vous serez connecté en tant que [nom d'utilisateur]. Tapez ce qui suit:
CREATE DATABASE [dbname];
Maintenant, quittez la session et revenez à votre session de terminal normale.
Restaurez la base de données à partir du fichier dont vous avez défini le nom de base de données cible comme nom de base de données que vous venez de créer.
cat [your_file_path/filename] | psql -U [username] [dbname]
Où [your_file_path/filename] est l'emplacement du fichier db ou du fichier texte que vous souhaitez restaurer.