42 votes

transfert de db d'une application heroku à une autre plus rapidement

Existe-t-il un moyen plus rapide de transférer ma base de données de production vers une application de test ?

Actuellement, je fais un heroku db:pull sur ma machine locale puis heroku db:push --app testapp mais cela devient chronophage. Je dispose de quelques données sur les semences, mais elles sont loin d'être aussi précises que les tests effectués avec mes données du monde réel. Et comme elles sont toutes deux stockées sur un nuage AWS voisin, il doit y avoir un moyen plus rapide de déplacer les données ?

J'ai pensé à utiliser un bundle heroku, mais j'ai remarqué que la commande animate a disparu ?

bundles:animate <bundle>     # animate a bundle into a new app

86voto

Zeeshan Points 2159

Il est assez courant de migrer les bases de données entre les environnements de test, d'essai et de production pour les applications Rails. Et heroku db:pull/push est douloureusement lent. Le meilleur moyen que j'ai trouvé jusqu'à présent est d'utiliser Module complémentaire Heroku PG Backups y c'est gratuit . J'ai suivi les étapes suivantes pour migrer base de données de production vers le serveur de transit :

1) ajouter l'add-on pgbackups aux applications de production et de staging

heroku addons:add pgbackups:basic --app production-app
heroku addons:add pgbackups:basic --app staging-app

Comme je n'utilise les pgbackups que pour la migration, le plan de base est suffisant pour cela.

2) Créez la sauvegarde de la base de données de l'application de production.

heroku pgbackups:capture --app production-app

Ceci va générer le fichier de sauvegarde b001 à partir de la base de données principale (habituellement production db dans database.yml)

3) Pour visualiser toutes les sauvegardes (FACULTATIF)

heroku pgbackups --app production-app

4) Utilisez maintenant la commande pgbackups:restore pour remplir la base de données du serveur de transit à partir du dernier fichier de sauvegarde du serveur de production.

heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app

Rappelez-vous que la restauration est une opération destructive, elle supprimera les données existantes avant de les remplacer par le contenu du fichier de sauvegarde.

14voto

Jonathon Batson Points 302

Donc les choses sont encore plus faciles maintenant vérifiez 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 ramenant le code de production sur mon site de transit.

0voto

Tometzky Points 8230
psql -h test_host -c 'drop database test_db_name; create database test_db_name;'

pg_dump -h production_host production_db_name | psql -h test_host test_db_name`

Cela peut être fait sur production_host ou sur test_host - fonctionnera dans les deux sens.

0voto

tfe Points 5789

Je ne l'ai pas testé, mais cela pourrait fonctionner.

Faites ceci pour obtenir l'URL de votre base de données source :

heroku console "ENV['DATABASE_URL']" --app mysourceapp

Ensuite, essayez d'exécuter db:push avec ça.

heroku db:push database_url_from_before --app mytargetapp

Cela pourrait ne pas fonctionner si Heroku ne permet pas l'accès aux machines DB depuis l'extérieur de leur réseau, ce qui est probablement le cas. Vous pourriez, peut-être, essayer d'utiliser taps (gemme que les commandes heroku db utilisent en interne) depuis le code de votre application quelque part (peut-être une tâche rake). Cela serait encore plus rapide que l'approche ci-dessus car tout reste complètement dans AWS.

Edit :

Voici une façon (certes bricolée) de faire ce que je viens de décrire :

Récupérez l'URL de la base de données comme dans le premier extrait de code ci-dessus. Ensuite, à partir d'une tâche rake (vous pourriez le faire sur la console, mais vous risquez de vous heurter à la limite de 30 secondes pour les commandes de la console), exécutez une commande shell vers taps (je n'ai pas pu déterminer facilement s'il est possible d'utiliser taps directement à partir de Ruby ; tous les documents montrent l'utilisation de la CLI) :

`taps pull database_url_from_source_app #{ENV['DATABASE_URL']}`

Les backticks sont importants ; c'est ainsi que Ruby désigne une commande shell, ce qu'est taps. Espérons que la commande taps soit accessible depuis l'application. Cela évite le problème de l'accès à la machine de la base de données depuis l'extérieur de Heroku, puisque vous exécutez cette commande depuis votre application.

0voto

user3140089 Points 1

Heroku vous permet de forker des applications existantes en production. Utilisez heroku fork pour copier une application existante, y compris les modules complémentaires, les variables de configuration et les données Heroku Postgres.

Suivez les instructions sur Heroku : https://devcenter.heroku.com/articles/fork-app

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X