Sur Heroku, j'essaie de copier la base de données de production dans mon application de transfert à l'aide de l'addon pgbackups. J'ai suivi les instructions sur la page d'addon: https://devcenter.heroku.com/articles/pgbackups
D'abord j'ai capturé la DB:
heroku pgbackups:capture --app production-app
Ça a marché:
HEROKU_POSTGRESQL_PURPLE (DATABASE_URL) ----backup---> b238
Capturing... done
Storing... done
Cependant, lorsque j'essaie de le restaurer sur l'application intermédiaire:
heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --remote staging
Je reçois le message d'erreur suivant:
DATABASE_URL does not match any of your databases
! Could not resolve database DATABASE
!
! Available databases:
J'ai aussi essayé de taper l'URL complète:
heroku pgbackups:url b238 --app production-app
heroku pgbackups:restore DATABASE "https://s3.amazonaws.com/..." --remote staging
et a également essayé de nommer l'application (au lieu de --remote staging):
heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app
Aucun de ceux-ci n'a fonctionné. Il est intéressant de noter que le message d'erreur indique qu'il n'y a pas de "bases de données disponibles". Je suppose que cela fait référence à l'application de mise en scène qui est en effet vide. Si je tape:
heroku pgbackups
Je reçois:
! No backups. Capture one with `heroku pgbackups:capture`.
Pour trouver les sauvegardes disponibles (production), je dois taper:
heroku pgbackups --app production-app
et je reçois la liste des sauvegardes en cours. Je ne sais pas si c'est normal ou même si c'est lié au problème, mais j'ai pensé que je devrais le mentionner.
J'ai lu et essayé chaque réponse ici sur SO mais rien n'a fonctionné. Des idées?
Mise à jour pour mi-2017 (dérobage de la réponse de Takehiro Mouri - simplifiez la partie DATABSE_NAME)
Mise à jour pour mi-2015 ...
Le module complémentaire pgbackups est obsolète. Pas plus pgbackups:transfer
.
Pour copier une base de données de votreapp vers votreapp_staging:
# turn off the web dynos in staging
heroku maintenance:on -a yourapp-staging
# if you have non-web-dynos, do them too
heroku ps:scale worker=0 -a yourapp-staging
# backup the staging database if you are paranoid like me (optional)
heroku pg:backups capture -a yourapp-staging
# execute the copy
heroku pg:copy your-app::DATABASE_URL DATABASE_URL -a yourapp-staging
Puis, une fois l’opération terminée, réactivez la mise en scène:
# this is if you have workers, change '1' to whatever
heroku ps:scale worker=1 -a yourapp-staging
heroku maintenance:off -a yourapp-staging
UPDATE: Cela ne fonctionne plus. Veuillez vous reporter au answer de @ lucas-nelson's ci-dessous.
Donc, les choses sont encore plus faciles maintenant .. checkout la commande de transfert dans le cadre de pgbackups
heroku pgbackups:transfer HEROKU_POSTGRESQL_PINK sushi-staging::HEROKU_POSTGRESQL_OLIVE -a sushi
Cela a fonctionné à merveille pour moi en reprenant le code de production sur mon site de mise en scène.
UPDATE: Vous pouvez exécuter cette commande pour transférer la base de données de la production vers le stockage intermédiaire: heroku pg:copy your-app::DATABASE_URL DATABASE_URL -a yourapp-staging
Cela vous invitera à confirmer l'action et, une fois que vous l'aurez fait, toutes les données seront migrées.
Voici une solution simple et sûre pour cela en utilisant les accessoires et la forge complémentaires de Heroku. Il ne nécessite aucune sauvegarde, aucun temps d'arrêt et n'écrase aucune base de données.
Vous devez d'abord attacher la base de données de production à l'application intermédiaire, puis créer un fork pour l'application intermédiaire. Si vous branchez l'application de production, puis la joignez à l'application intermédiaire, l'application de facturation sera l'application de production et vous ne pourrez pas en détacher la fourche.
1. Commencez par trouver le nom du module complémentaire de votre base de données de production (ici, il s'agit de postgres-prod-123
):
$ heroku addons --app myapp-production
heroku-postgresql (postgresql-prod-123) standard-0 $50/month
└─ as DATABASE
2. Puis attachez le complément de base de données de production de votre application de transfert. Donnez-lui un nom comme PRODUCTION_DB
pour le rendre facile à reconnaître:
$ heroku addons:attach postgresql-prod-123 --app myapp-staging --as PRODUCTION_DB
3. Puis créer un fork de la base de données de production sur l'application de transfert:
$ heroku addons:create heroku-postgresql:standard-0 --fork PRODUCTION_DB_URL --as STAGING_DB --app myapp-staging
4. Finalement, promouvez le fork comme base de données principale de votre application de transfert:
$ heroku pg:promote STAGING_DB --app myapp-staging
Terminé! Votre application de transfert utilise maintenant une copie de votre base de données de production. Notez que votre base de données de transfert précédente est toujours là. Vous voudrez peut-être la détruire après vous être assuré que tout fonctionne.
Pour nettoyer, détachez la base de données de production de l'application intermédiaire:
$ heroku addons:detach postgresql-prod-123 --app myapp-staging
Cela fonctionne pour moi:
heroku pg:copy you-app-production::DATABASE DATABASE -a you-app-staging
Commencez par créer une sauvegarde à jour de la production:
heroku pgbackups:capture -a productionappslug --expire
Découvrez quelle couleur Heroku a nommé votre base de données.
https://postgres.heroku.com/databases ou https://dashboard.heroku.com/apps/STAGINGAPPSLUG/resources
Chargez ensuite la sauvegarde de la base de données de production dans le stockage intermédiaire (en changeant le rouge en votre couleur):
heroku pgbackups:restore HEROKU_POSTGRESQL_RED -a stagingappslug `heroku pgbackups:url -a productionappslug`
stagingappslug et liveappslug sont les noms abrégés de vos applications heroku.
Pour transférer (copier) la base de données production (source base de données) dans la base de données stockage intermédiaire (base de données cible), vous devez appeler pg:copy
à partir de l'application cible, faisant référence à une base de données source.
heroku pg:copy source-application::OLIVE HEROKU_POSTGRESQL_PINK -a target-application
Un autre exemple:
heroku pg:copy my-production-app::HEROKU_POSTGRESQL_OLIVE HEROKU_POSTGRESQL_PINK --app my-staging-app
Pour obtenir les noms color de vos bases de données, utilisez:
heroku pg --app my-production-app
heroku pg --app my-staging-app
Voir pg: copie
Je me débattais avec le même problème. Selon la réponse à cette question , le problème pourrait être votre version de gemme heroku. Je viens de mettre à jour ma version (de 2.26.2 à 2.26.6) et maintenant cela fonctionne.
Après pas de chance. (J'utilise heroku gem 2.31.4) J'ai fait ce qui suit (aide pour les lasses)
Connexion à la console de la base de données Heroku
Connectez-vous à la création> 'Paramètres'> PGRestore> Copier les 'Paramètres de connexion' dans un fichier texte.
Connectez-vous à la production> Instantanés, appuyez sur '+' pour effectuer une nouvelle sauvegarde dès maintenant. Puis appuyez sur télécharger. Téléchargez Dans le dossier apps/tmp ou comme vous le souhaitez.
Définir le transfert en mode maintenance
$ heroku maintenance: sur
Exécutez la commande comme suit, avec le texte des paramètres de connexion et le fichier de vidage à la fin: PGPASSWORD = {... des éléments ici ...} -p 5432 'tmp/b048.dump.dump'
Après avoir couru:
$ heroku maintenance: off
Connectez-vous à la mise en scène et vérifiez que les choses correspondent. Trouvez une transaction récente que vous savez être en production si vous le pouvez via. $ heroku lance la console pour les deux applications et vérifie la correspondance des identifiants.
Je pense que ce n'est pas --remote son --app essayez ceci:
heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app
C'est ce qui a fonctionné pour moi
heroku pg:backups restore 'DUMP_FILE_URL_FROM_S3' DATABASE --app MY_APP