将db从一个heroku应用程序更快地转移到另一个

有没有更快的方法将我的生产数据库转移到testing应用程序?

目前我正在做一个heroku db:pull我的本地机然后heroku db:push --app testapp但这是变得耗时。 我有一些种子数据,但它不像testing我的真实世界的数据一样准确。 既然它们都存储在相邻的AWS云上,那么移动数据必须有更快的方法吗?

我想过使用heroku包,但我注意到animation命令已经消失了?

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

在Rails应用程序的登台,testing和生产环境之间迁移数据库是很常见的。 而heroku db:pull/push是痛苦的缓慢。 到目前为止,我发现的最好的方法是使用Heroku PG Backups插件 , 它是免费的 。 我遵循以下步骤将生产数据库迁移到登台服务器:

1)创build生产应用程序数据库的备份

 heroku pg:backups capture --app production-app 

这将从主数据库生成b001备份文件(通常是database.yml中的生产数据库)

2)查看所有备份(可选)

 heroku pg:backups --app production-app 

3)现在使用pg:backups restore命令从生产服务器上的最后一个备份文件填充登台服务器数据库

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

请记住,还原是一种破坏性的操作,它将删除现有数据,然后将其replace为备份文件的内容。

所以事情现在更容易了..检查传输命令作为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

这对于我将生产代码返回到我的临时站点非常合适。

截至2015年3月11日,正确的答案已经改变。

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

具体说明该参数现在是public-url

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

2015年中更新…

pgbackups加载项已被弃用。 没有更多的pgbackups:transferpg:copy是这种情况的理想select。

yourapp (示例数据库名称:HEROKU_POSTGRESQL_PINK_URL)复制数据库到yourapp_staging (示例数据库名称: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 

然后,当完成时,请重新登台:

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

提醒:您可以使用heroku pg:info -a yourapp-staging (和yourapp)来获取数据库常量。

(来源: 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` 

这可以在production_host上完成,也可以在test_hosttest_host – 可以同时工作。

还没有testing过,但可能会起作用。

这样做来获取源数据库的URL:

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

然后尝试执行db:push

 heroku db:push database_url_from_before --app mytargetapp 

如果Heroku不允许从networking外部访问数据库机器,这可能不起作用,情况可能如此。 你也许可以尝试在你的应用代码中使用tap(heroku db命令在内部使用的gem)(也许是rake任务)。 这将比上述方法更快,因为一切都完全在AWS内。

编辑:

这是一个(无可否认的)方式来做我上面描述的:

像上面第一个代码片段那样抓取数据库URL。 然后从一个rake任务(你可以在控制台上执行它,但是你可能会遇到控制台命令的超时时间超过30秒),执行一个shell命令来轻敲(不能轻易确定是否可以直接从Ruby使用tap;所有docs显示CLI的使用):

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

反引号是重要的; 这就是Ruby如何表示一个shell命令,哪个是水龙头。 希望可以从应用程序访问水龙头命令。 这避免了从Heroku外部访问数据库机器的问题,因为您正在从您的应用程序中运行此命令。

Heroku使您能够在生产中分离现有的应用程序。 使用heroku fork复制现有的应用程序,包括附件,configurationvariables和Heroku Postgres数据。

按照Heroku上的说明: https : //devcenter.heroku.com/articles/fork-app

2016年年中更新…

Heroku在制作叉子时现在有一个--fast标志,但是它们将会长达30小时的过时。

$ 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