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

16

J'essaie d'exécuter la commande suivante:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

Je reçois:

failed: FATAL:  database "new_db" does not exist
andilabs
la source

Réponses:

19

C'est parce que c'est la façon dont pg_restore fonctionne.

pg_restore manual 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 .

Le -d restaure 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.

SCO
la source
6
Pour clarifier: il n'y a aucun moyen de créer un nom de base de données arbitraire et de le restaurer avec pg_restore. L'option -C ne peut créer qu'une base de données dont le nom correspond au nom de la base de données dans le fichier de vidage. Pour restaurer dans une base de données arbitraire, vous devez exécuter CREATE DATABASE new_db;en psql avant de lancer pg_restore --dbname=new_db.
Luke
ma commandedocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma
5
Pourquoi les outils doivent-ils prêter à confusion alors qu'ils pourraient être faciles?
Augustin Riedinger
8

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éer explicitement nouveau)

createdatabase the_database
pg_restore -d the_database db.dump

Voir ce que SCO a dit pour plus de détails.

lzap
la source
Votre première suggestion n'a pas fonctionné le 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan
Je peux confirmer que cela fonctionne (après l'édition et après avoir corrigé l'orthographe des "postgres"). pg_restore -C -d postgres db.dumppeut sembler effrayant, mais il ne fait rien à la base de données postgres, il ne l'utilise que pour la connexion initiale.
Zilk
0

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ù [chemin_votre_fichier / nom de fichier] correspond à l'emplacement du fichier db ou du fichier texte que vous souhaitez restaurer.

AntiPawn79
la source
Lors de la création de la sauvegarde à l'aide de l' -Foption, vous devez utiliser pg_restore pour restaurer la sauvegarde, sauf si vous utilisez -F pce qui produit un fichier texte brut avec des phrases SQL.
EAmez