web-dev-qa-db-fra.com

pg_restore avec l'option -C ne crée pas la base de données

J'utilise pg_dump et pg_restore pour la sauvegarde et la restauration de la base de données postgres.

Voici quelques informations de la documentation qui seront pertinentes pour cette question Pour Pg_restore, l'option -C est décrite comme suit

-C

--créer

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.

Cependant, même lorsque j'utilise cette option avec pg_restore, j'obtiens l'erreur suivante

pg_restore: [archiveur (db)] connexion à la base de données "test" a échoué: FATAL:> la base de données "test" n'existe pas

Selon la description, l'option -C aurait dû créer la base de données manquante. Mais ce n'est pas le cas dans mon cas.

Voici les étapes que j'ai effectuées pour la sauvegarde et la restauration:

  1. Utilisez pg_dump pour sauvegarder la base de données
pg_dump -N backup -d test --format custom -v -h xxhostxx -p 5432 -U xxuserxx --lock-wait-timeout 300000 -f test_pg_dump.dmp

Remarque: ne pas utiliser l'option -C car elle n'a de sens que pour les formats de texte brut

  1. Suppression de la base de données test

  2. utiliser pg_resore pour restaurer la base de données

    pg_restore -C -d test -v -h xxhostxx -p 5432 -U xxuserxx test_pg_dump.dmp**
    

Je ne peux pas comprendre quel est le problème ici! Suis-je en train de faire quelque chose de mal? Faites-moi savoir si plus d'informations sont nécessaires.

14
Swapnil17

Exactement comme @Eelke l'a dit - vous avez dans le fichier écrit "créer une base de données", donc cette base de données n'existe pas lorsque vous exécutez un script ... C'est pour cela qu'il y a toujours une base de données "postgres". Essaye ça:

pg_restore -C -d postgres -v -h xxhostxx -p 5432 -U xxuserxx test_pg_dump.dmp**

Et cela devrait:

  1. se connecter à la base de données postgres
  2. Créer une base de données de test
  3. Se déconnecter des postgres et se connecter pour tester
  4. Télécharger des données dans la base de données

Bien sûr, vérifiez qui est le propriétaire de la base de données postgres - dans la plupart des cas, vous devez l'exécuter en tant qu'utilisateur "postgres".

4
Jendrusk

La citation suivante ne signifie pas ce que vous pourriez penser que cela signifie. J'ai aussi dû le lire trois fois avant de réaliser ce qu'ils disaient.

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.

Cela signifie que pg_restore se connectera initialement à la base de données spécifiée avec -d. Il ne créera PAS cette base de données. Il crée une base de données avec le nom de l'archive que vous restaurez et restaure les données dans cette base de données.

4
Eelke

Cela n'a jamais fonctionné pour moi, donc cette commande crée la base de données

createdb -h Host -U USER -W DB_NAME

puis exécutez la restauration pg

pg_restore -d DB_NAME -v -h Host -p PORT -U USER DUMP_FILE.dump**

Fin de l'histoire

0
Andres Leon Rangel