Réponses:
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.
docker-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"'
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.
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
peut sembler effrayant, mais il ne fait rien à la base de données postgres, il ne l'utilise que pour la connexion initiale.
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ù [chemin_votre_fichier / nom de fichier] correspond à l'emplacement du fichier db ou du fichier texte que vous souhaitez restaurer.
-F
option, vous devez utiliser pg_restore pour restaurer la sauvegarde, sauf si vous utilisez -F p
ce qui produit un fichier texte brut avec des phrases SQL.
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écuterCREATE DATABASE new_db;
en psql avant de lancerpg_restore --dbname=new_db
.