web-dev-qa-db-fra.com

pourquoi pg_restore ignore -create? Erreur: échec: FATAL: la base de données "new_db" n'existe pas

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
19
andilabs

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.

22
SCO

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.

10
lzap

Pour être un peu plus explicite, voici ce que j'ai fait qui a résolu le problème pour moi:

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

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

0
AntiPawn79