将数据库从一个heroku应用程序转移到另一个更快
Posted
技术标签:
【中文标题】将数据库从一个heroku应用程序转移到另一个更快【英文标题】:transfer db from one heroku app to another faster 【发布时间】:2011-04-20 12:02:13 【问题描述】:有没有更快的方法将我的生产数据库转移到测试应用?
目前我正在对我的本地机器执行heroku db:pull
,然后是heroku db:push --app testapp
,但这变得非常耗时。我有一些种子数据,但它不如简单地使用我的真实数据进行测试那样准确。而且由于它们都存储在相邻的 AWS 云上,因此必须有更快的方法来移动数据?
我曾考虑过使用 heroku 包,但发现 animate 命令不见了?
bundles:animate <bundle> # animate a bundle into a new app
【问题讨论】:
旁注:Heroku bundles 和 Bundler 是独立且不相关的概念。 啊,是的,当我写它的时候,我什至没有想到可能的混淆。 【参考方案1】: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_host
上完成——这两种方式都可以。
【讨论】:
这会很慢,除非数据库和运行pg_dump ...| psql...
的机器都在同一个EC2区域。【参考方案2】:
尚未对此进行测试,但它可能会起作用。
执行此操作以获取源数据库的 URL:
heroku console "ENV['DATABASE_URL']" --app mysourceapp
然后尝试执行db:push
。
heroku db:push database_url_from_before --app mytargetapp
如果 Heroku 不允许从其网络外部访问数据库机器,这可能不起作用,这可能就是这种情况。您也许可以尝试在您的应用程序代码中的某个地方(可能是一个 rake 任务)使用 taps(heroku db 命令在内部使用的 gem)。这将比上述方法更快,因为一切都完全在 AWS 中。
编辑:
这是一种(不可否认的)方法来做我上面描述的事情:
在上面的第一个代码 sn-p 中获取数据库 URL。然后从一个 rake 任务(您可以在控制台上执行此操作,但您可能会遇到控制台命令的 30 秒超时限制),执行一个 shell 命令来轻敲(无法轻易确定是否可以直接从 Ruby 中使用轻敲;所有文档展示了 CLI 的使用):
`taps pull database_url_from_source_app #ENV['DATABASE_URL']`
反引号很重要;这就是 Ruby 表示 shell 命令的方式,它是 taps 。希望可以从应用程序访问 taps 命令。这避免了从 Heroku 外部访问数据库机器的问题,因为您是在应用程序中运行此命令。
【讨论】:
Taps 已被弃用很长时间了。【参考方案3】:在 Rails 应用程序的暂存、测试和生产环境之间迁移数据库是很常见的。而heroku db:pull/push
非常缓慢。到目前为止我发现的最好方法是使用Heroku PG Backups add-on 和it's free。我按照以下步骤迁移
生产数据库到登台服务器:
1) 为生产应用数据库创建备份
heroku pg:backups capture --app production-app
这将从主数据库(通常是database.yml中的生产数据库)生成b001备份文件
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
请记住,还原是一种破坏性操作,它会先删除现有数据,然后再将其替换为备份文件的内容。
【讨论】:
快速注意,此过程不会删除并重新创建架构。这意味着如果您在暂存中有额外的表,它们在还原后仍然存在。如果您希望表消失,则需要执行 db:schema:load(或其他命令)来重新创建架构。 我明白了!执行此操作时未找到备份。你知道是什么问题吗? @patrick 如果您的临时应用程序只有 1 个数据库,您可以省略 DATABASE。 在此之前将应用程序置于维护模式也是一个好主意。有一段时间没有数据库限制活动,您最终可能会收到损坏的数据。 我这样做总是失败。错误:“!未知数据库:”【参考方案4】:所以现在事情变得更容易了.. 签出传输命令作为 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
这对我将生产代码带回我的暂存站点非常有效。
【讨论】:
是的,但这会破坏原始数据库。我会使用 pg:copy 代替pg:backups restore
也会破坏原始数据库(参见here):“与之前的 pgbackups 命令不同,您无法将部分备份还原到现有数据库中。当您运行 pg:backups restore 时,所有在还原备份之前从目标数据库中删除数据。”
@gabe pg:backups restore
不会破坏原始数据库。您提到的报价说它将删除 target 数据库中的所有数据,而不是源。【参考方案5】:
Heroku 使您能够在生产环境中分叉现有应用程序。使用 heroku fork 复制现有应用程序,包括附加组件、配置变量和 Heroku Postgres 数据。
按照 Heroku 上的说明进行操作:https://devcenter.heroku.com/articles/fork-app
【讨论】:
这在任何规模的应用程序上都几乎无法使用。复制您的(可能很多)数据库很昂贵,而且需要很长时间。【参考方案6】:2015 年年中更新...
pgbackups 插件已被弃用。没有更多的pgbackups:transfer
。 pg: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)
【讨论】:
【参考方案7】:自 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
【讨论】:
【参考方案8】: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
【讨论】:
以上是关于将数据库从一个heroku应用程序转移到另一个更快的主要内容,如果未能解决你的问题,请参考以下文章
如何将 iOS 应用程序从一个开发者帐户转移到另一个帐户? [关闭]