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

时间:2010-10-03 15:11:44

标签: ruby-on-rails ruby heroku

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

目前我正在heroku db:pull到我的本地计算机heroku db:push --app testapp,但这变得非常耗时。我有一些种子数据,但它不如仅仅使用我的真实数据进行测试那么准确。既然它们都存储在相邻的AWS云上,那么必须有更快的方式来移动数据吗?

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

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

8 个答案:

答案 0 :(得分:86)

在Rails应用程序的登台,测试和生产环境之间迁移数据库是很常见的。 heroku db:pull/push非常缓慢。我到目前为止找到的最好方法是使用Heroku PG Backups add-onit's free。我按照以下步骤进行迁移 生产数据库到登台服务器:

1)为production-app db

创建备份
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

请记住,还原是一种破坏性操作,它会在将其替换为备份文件的内容之前删除现有数据。

答案 1 :(得分:14)

所以现在事情变得更加容易了。在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

这对我将生产代码带回我的临时站点非常有效。

答案 2 :(得分:11)

截至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

答案 3 :(得分:10)

2015年中期更新......

pgbackups附加组件已被弃用。不再pgbackups:transferpg:copy非常适合这种情况。

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

答案 4 :(得分:0)

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_hosttest_host上完成 - 可以双向工作。

答案 5 :(得分:0)

尚未对此进行测试,但可能会有效。

执行此操作以获取源数据库的URL:

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

然后尝试执行db:push

heroku db:push database_url_from_before --app mytargetapp

如果Heroku不允许从网络外部访问数据库计算机,这可能不起作用,这可能就是这种情况。或许,您可以尝试在应用程序代码中使用点击(heroku db命令在内部使用的gem)(可能是rake任务)。这将比上述方法更快,因为一切都完全在AWS内。

修改

这是一种(诚然是hacky)方式来做我上面描述的:

抓取数据库网址,如上面的第一个代码段所示。然后从rake任务(你可以在控制台上执行它,但你冒险在控制台命令上运行30秒超时限制),执行一个shell命令来点击(无法轻易确定是否可以直接从Ruby使用点击;所有docs显示了CLI的使用:

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

反引号很重要;这就是Ruby表示shell命令的方式,它是taps的。希望可以从应用程序访问点击命令。这样可以避免从Heroku外部访问数据库机器的问题,因为您正在从应用程序中运行此命令。

答案 6 :(得分:0)

Heroku使您可以在生产中分叉现有应用程序。使用heroku fork复制现有应用程序,包括附加组件,配置变量和Heroku Postgres数据。

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

答案 7 :(得分:0)

2016年年中更新......

Heroku现在在创建分叉时会有一个// Baseline setup // -------------- // Establish the root object, `window` in the browser, or `global` on the server. var root = this; // Save the previous value of the `_` variable. var previousUnderscore = root._; // Establish the object that gets returned to break out of a loop iteration. var breaker = {} 标记,但是它们将会过时30个小时。

--fast

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