J'utilise l'option Postgres de Heroku et j'ai téléchargé une sauvegarde à partir d'elle. Je voudrais le restaurer dans une nouvelle base de données afin que je puisse le regarder. J'ai essayé différentes commandes en vain. Mon premier essai:
$ Sudo -u postgres psql < db/backups/myapp_2018-05-27.pg.dump
The input is a PostgreSQL custom-format dump.
Use the pg_restore command-line client to restore this dump to a database.
J'essaye donc:
$ Sudo -u postgres pg_restore -d myapp3 -C db/backups/myapp_2018-05-27.pg.dump
pg_restore: [archiver (db)] connection to database "myapp3" failed: FATAL: database "myapp3" does not exist
Je ne comprends pas vraiment le -C
option .
-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.
Il me semble logique de restaurer dans la nouvelle base de données. Je m'éloigne du sujet… (et peut-être que cela est correctement expliqué ici )
J'ai essayé de créer une nouvelle base de données à partir du modèle d'une autre, plus ancienne avec le même schéma:
$ Sudo -u postgres createdb -T myapp myapp3
$ Sudo -u postgres pg_restore -d myapp3 -C db/backups/myapp_2018-05-27.pg.dump
pg_restore: [archiver (db)] Error while PROCESSING TOC:
<snip>
WARNING: errors ignored on restore: 5
Je reçois beaucoup d'erreurs sur un utilisateur qui n'existe pas et aucune donnée insérée.
J'ai également essayé d'utiliser template0
mais cela soulève des erreurs sur le schéma, comme je m'y attendais.
En résumé, je voudrais restaurer à partir d'une sauvegarde Heroku Pg dans une nouvelle base de données. Je ne sais pas comment éviter les erreurs sur les index et les utilisateurs manquants, etc. et ont le schéma prêt.
J'ai aussi essayé -O
à cause de cette ligne dans les documents:
Avec -O, n'importe quel nom d'utilisateur peut être utilisé pour la connexion initiale, et cet utilisateur sera propriétaire de tous les objets créés.
Je semble avoir mal compris cela aussi parce que, encore une fois, l'écran était rempli d'erreurs.
Modifier: basé sur le -C
réponse liée J'ai réussi à restaurer dans une base de données nommée de manière cryptique, mais lorsque j'exécute la commande renommer la base de données (alter database rtyghjkuyhgh rename to my_app3
) il vide toutes les données :(
Toute aide ou information, même juste un point dans la bonne direction, serait très appréciée.
Postgres version 9.5.12
Donc, la réponse:
Sudo -u postgres createdb -T myapp myapp5
Sudo -u postgres pg_restore -d some_other_db -C -O db/backups/myapp_2018-05-27.pg.dump
$ psql \c some_other_db alter database ghji76yhjkj rename to myapp5
1) Passez d'abord au superutilisateur su - postgres
2) puis créé une nouvelle base de données createdb myapp3
--DROP est déjà créé
3) changez maintenant le directeur en chemin de fichier de sauvegarde, c'est-à-dire cd db/backups/
4) Maintenant, exécutez ceci pour restaurer votre fichier personnalisé de vidage
pg_restore -j 8 -U postgres -d myapp3 myapp_2018-05-27.pg.dump
5) Si vous ne parvenez toujours pas à restaurer la base de données, veuillez prendre un nouveau bkup avec
pg_dump -U postgres -Fc myapp3 > myapp_2018-05-27.dump
supprimez .pg et essayez de restaurer à nouveau.
Définissons quelques variables pour faciliter le reste à copier/coller (en utilisant les noms de la question d'origine)
old_db=myapp
new_db=myapp3
db_dump_file="backups/myapp_2018-05-27.pg.dump"
Ce qui suit suppose que votre sauvegarde a été créée avec le format "personnalisé" comme ceci:
pg_dump -U postgres -F custom "$old_db" > "$db_dump_file"
Restaurer $db_dump_file
vers un nouveau nom de base de données $new_db
:
dropdb -U postgres --if-exists "$new_db"
createdb -U postgres -T template0 "$new_db"
pg_restore -U postgres -d "$new_db" "$db_dump_file"