web-dev-qa-db-fra.com

Comment transférer une base de données de production vers une mise en scène sur Heroku avec pgbackups Obtenir une erreur

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?

41
Luciano

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

(source: https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#upgrade-with-pg-copy-default )

74
Lucas Nelson

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

https://devcenter.heroku.com/articles/upgrade-heroku-postgres-with-pgbackups#transfering-databases-between-heroku-applications

Cela a fonctionné à merveille pour moi en reprenant le code de production sur mon site de mise en scène.

15
Jonathon Batson

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.

15
Takehiro Mouri

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
9
davb

Cela fonctionne pour moi: heroku pg:copy you-app-production::DATABASE DATABASE -a you-app-staging

5
Josh

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.

1
Daniel Morris

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

1
user664833

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.

1
kbjerring

Après pas de chance. (J'utilise heroku gem 2.31.4) J'ai fait ce qui suit (aide pour les lasses)

  1. Connexion à la console de la base de données Heroku

  2. Connectez-vous à la création> 'Paramètres'> PGRestore> Copier les 'Paramètres de connexion' dans un fichier texte.

  3. 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.

  4. Définir le transfert en mode maintenance 

    $ heroku maintenance: sur

  5. 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'

  6. Après avoir couru: 

    $ heroku maintenance: off

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

0
Evolve

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
0
Fernando Caride

C'est ce qui a fonctionné pour moi

  • Téléchargez la sauvegarde à partir de la console heroku et transférez-la sur s3. 
  • heroku pg:backups restore 'DUMP_FILE_URL_FROM_S3' DATABASE --app MY_APP
0
Saqib R.