2010-10-03 132 views
41

将生产数据库转移到测试应用程序有更快的方法吗?将数据库从一个heroku应用程序转移到另一个应用程序更快

目前我正在为我的本地机器做heroku db:pull,然后heroku db:push --app testapp,但这会变得非常耗时。我有一些种子数据,但它不像使用我的真实世界数据测试那么准确。由于它们都存储在相邻的AWS云上,因此必须有更快的方式来移动数据?

我想过使用一个heroku包,但我注意到animate命令不见了?

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

旁注:Heroku的束和捆扎机是分开的,不相关的概念。 – tfe 2010-10-05 06:40:41

+0

嗯,当我写这些时,我甚至都没有想过这种可能的混淆。 – holden 2010-10-05 13:54:49

回答

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 —将是双向的完成。

+0

这将非常缓慢,除非数据库和机器运行'pg_dump ... | psql ...'在同一个EC2区域。 – jelder 2015-06-02 22:29:57

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内。

编辑:

下面是一个(当然哈克)的方式做上述I:

抓取数据库的URL,如上面的第一个代码段。然后从一个rake任务(你可以在控制台上执行它,但是你有可能在console命令中运行超过30秒的超时限制),执行一个shell命令来轻敲(无法轻易确定是否可以直接从Ruby使用tap;全部文档显示使用CLI):

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

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

+0

龙头现在已经被弃用很长一段时间了。 – jelder 2015-06-02 22:28:07

86

这是很常见的分期迁移,测试和生产环境之间数据库的Rails应用。而heroku db:pull/push是痛苦的缓慢。目前为止我发现的最好方法是使用Heroku PG Backups add-onit's free。我也跟着下面的步骤来迁移 生产数据库到临时服务器:

1)创建用于生产应用DB

heroku pg:backups capture --app production-app 

这将从主数据库(通常是生产数据库中生成B001备份文件备份数据库。阳明海运)

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

heroku pg:backups --app production-app 

3)现在使用PG:备份恢复命令来填充从上次备份文件生产服务器上临时服务器数据库

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

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

+4

快速注意,此过程不会删除并重新创建模式。这意味着如果你在临时表中有额外的表,它们在恢复后仍然会在那里。如果希望表消失,则需要执行db:schema:load(或其他命令)来重新创建模式。 – Mainguy 2012-08-21 16:52:53

+1

我得到了!执行此操作时未找到备份。你知道什么是问题吗? – patrick 2012-12-08 01:05:09

+0

@patrick如果您的登台应用程序只有1个数据库,您可以省略DATABASE。 – ckbhodge 2013-03-16 03:00:17

13

所以事情更容易现在..检出转移命令,这美丽的工作对我来说服用生产代码回到我的临时站点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

的一部分。

+3

是的,但这会破坏原始分贝。我会使用pg:copy而不是 – blushrt 2015-03-30 14:22:49

+0

'pg:backups restore'也会破坏原始数据库(参见[这里](https://devcenter.heroku.com/articles/heroku-postgres-backups#restoring-backups)):“不像与以前的pgbackups命令一样,您不能将部分备份还原到现有数据库中。运行pg:backups restore时,在还原备份之前,将从目标数据库中删除所有数据。 – gabe 2015-10-27 21:33:35

+0

@gabe'pg:backups restore'不会破坏原始数据库。你提到的报价表示它将删除* target * DB中的所有数据,而不是来源。 – jhirsch 2016-10-11 18:25:59

0

Heroku使您能够在生产中分叉现有的应用程序。使用heroku fork来复制现有的应用程序,包括加载项,配置变量和Heroku Postgres数据。

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

+0

这对于任何重要规模的应用程序都不可用。这是昂贵的,需要永远复制你(可能很多)的数据库。 – jelder 2015-06-02 22:26:21

10

更新2015年中期...

的pgbackups附加已被弃用。没有更多pgbackups:transferpg:copy是此场景的理想选择。 HEROKU_POSTGRESQL_PINK_URL到yourapp_staging(例如数据库名称:

yourapp(例如数据库名称复制数据库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

相关问题