将数据库从一个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_hosttest_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: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)

【讨论】:

【参考方案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应用程序转移到另一个更快的主要内容,如果未能解决你的问题,请参考以下文章

将 hive 表从一个数据库转移到另一个

如何将 iOS 应用程序从一个开发者帐户转移到另一个帐户? [关闭]

将 iOS 应用程序从一个开发者帐户转移到另一个帐户?

将IOS App从一个账户的Testflight转移到另一个账户

将核心数据从一个项目转移到另一个项目

如何将付费安卓应用从一个谷歌账户转移到另一个谷歌账户