transférer db d’une application heroku à une autre plus rapidement

Existe-t-il un moyen plus rapide de transférer ma firebase database 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 prend beaucoup de temps. J’ai des données de départ mais ce n’est pas aussi précis que de simplement tester avec mes données réelles. Et comme ils sont tous deux stockés sur un cloud 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 avait disparu?

 bundles:animate  # animate a bundle into a new app 

Il est courant de migrer des bases de données entre des environnements de transit, de test et de production pour les applications Rails. Et heroku db:pull/push est terriblement lent. Le meilleur moyen que j’ai trouvé à ce jour est d’utiliser le module complémentaire Heroku PG Backup et c’est gratuit . J’ai suivi les étapes suivantes pour migrer la firebase database de production vers le serveur de transfert:

1) Créez la sauvegarde pour la production-app db

 heroku pg:backups capture --app production-app 

Cela générera un fichier de sauvegarde b001 à partir de la firebase database principale (généralement la firebase database de production dans database.yml)

2) Pour voir toutes les sauvegardes (FACULTATIF)

 heroku pg:backups --app production-app 

3) Maintenant, utilisez la commande pg: backups restore pour remplir la firebase database du serveur intermédiaire à partir du dernier fichier de sauvegarde sur le serveur de production.

 heroku pg:backups restore $(heroku pg:backups public-url --app production-app) DATABASE_URL --app staging-app 

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

Donc, les choses sont encore plus faciles maintenant … consultez 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/upgrading-heroku-postgres-databases#4b-alternative-transfer-data-between-applications

Cela a fonctionné à merveille pour que je ramène le code de production sur mon site de stockage.

La réponse correcte a changé à nouveau le 11 mars 2015.

 heroku pg:backups restore $(heroku pg:backups public-url --app myapp-production) DATABASE_URL --app myapp-staging 

Notez spécifiquement que l’argument est maintenant public-url .

https://blog.heroku.com/archives/2015/3/11/pgbackups-levels-up

Mise à jour mi-2015 …

Le module complémentaire pgbackups est obsolète. Plus de pgbackups:transfer . pg:copy est idéal pour ce scénario.

Pour copier une firebase database à partir de votre application (par exemple, nom de la firebase database: HEROKU_POSTGRESQL_PINK_URL à yourapp_staging (exemple nom de la firebase database: HEROKU_POSTGRESQL_WHITE_URL)

 # 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 to splat over the top of the staging database heroku pg:copy yourapp::HEROKU_POSTGRESQL_PINK_URL HEROKU_POSTGRESQL_WHITE_URL -a yourapp-staging 

Ensuite, une fois terminé, remettez en marche:

 # this is if you have workers, change '1' to whatever heroku ps:scale worker=1 -a yourapp-staging heroku maintenance:off -a yourapp-staging 

Rappel: vous pouvez utiliser heroku pg:info -a yourapp-staging (et votre application) pour obtenir les constantes de la firebase database.

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

 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.

Je n’ai pas testé cela, mais cela pourrait fonctionner.

Faites-le pour obtenir l’URL de votre firebase database source:

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

Ensuite, essayez d’exécuter db:push avec cela.

 heroku db:push database_url_from_before --app mytargetapp 

Cela pourrait ne pas fonctionner si Heroku n’autorise pas l’access aux machines de firebase database en dehors de leur réseau, ce qui est probablement le cas. Vous pourriez, peut-être, essayer d’utiliser des taps (gem que les commandes heroku db utilisent en interne) à partir de votre code d’application quelque part (peut-être une tâche de rake). Ce serait encore plus rapide que l’approche ci-dessus, car tout rest complètement dans AWS.

Modifier:

Voici une façon (certes pirate) de faire ce que j’ai décrit ci-dessus:

Prenez l’URL de la firebase database comme dans le premier extrait de code ci-dessus. Ensuite, à partir d’une tâche rake (vous pouvez le faire sur console mais vous risquez de vous heurter à une limite de 30 secondes sur les commandes de la console), exécutez une commande shell sur taps (impossible de déterminer s’il est possible d’utiliser des taps directement depuis Ruby). docs 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 qui est le cas. J’espère que la commande de taps est accessible depuis l’application. Cela évite le problème d’access à la machine de firebase database depuis l’extérieur de Heroku, puisque vous exécutez cette commande depuis votre application.

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

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

Mise à jour mi-2016 …

Les Heroku ont maintenant un drapeau --fast lors de la création des fourches, mais ils seront jusqu’à 30 heures obsolètes.

$ heroku addons:create heroku-postgresql:standard-4 --fork HEROKU_POSTGRESQL_CHARCOAL --fast --app sushi

https://devcenter.heroku.com/articles/heroku-postgres-fork#fork-fast-option