【问题标题】:Heroku transfer db from one app to anotherHeroku 将数据库从一个应用程序转移到另一个应用程序
【发布时间】:2015-06-27 12:02:54
【问题描述】:

我需要将 db 从 app_1 转移到 app_2

我在 app_1 上创建了备份

然后跑:

heroku pg:backups restore HEROKU_POSTGRESQL_COLOR --app app_2 heroku pgbackups:url --app app_1

HEROKU_POSTGRESQL_COLOR = app_2 的数据库 URL

然后我得到:

 !    `pg:backups` is not a heroku command.
 !    Perhaps you meant `pgbackups`.
 !    See `heroku help` for a list of available commands.

所以我跑了:

heroku pgbackups:restore HEROKU_POSTGRESQL_COLOR --app app_2 heroku pgbackups:url --app app_1

然后我得到以下信息:

!    WARNING: Destructive Action
!    This command will affect the app: app_2
!    To proceed, type "app_2" or re-run this command with --confirm app_2

所以我确认了:

> app_2
 !    Please add the pgbackups addon first via:
 !    heroku addons:add pgbackups

然后我跑了:heroku addons:add pgbackups --app app_2

Adding pgbackups on app_2... failed
 !    Add-on plan not found.

有没有办法解决这个问题?任何帮助将不胜感激!

* 解决方案 *

我最终向 Heroku 发送了电子邮件,他们建议我需要 heroku update; heroku plugins:updateheroku update 仅适用于 heroku 工具带,并且我安装了 gem。

解决办法:

安装 Heroku 工具带here

然后卸载gem:

gem uninstall heroku --all

运行以下命令获取版本,它应该输出heroku-toolbelt,而不是gem,更多信息here

$ heroku --version
  heroku-toolbelt/2.39.0 (x86_64-darwin10.8.0) ruby/1.9.3

复制数据库:

heroku pg:backups restore `heroku pgbackups:url --app app_1` HEROKU_POSTGRESQL_COLOR --app app_2

但更好的是——您可以直接从一个数据库复制到另一个数据库,而无需备份:

假设 app_2 数据库 url 为:HEROKU_POSTGRESQL_GOLD

heroku pg:copy app_1::DATABASE_URL GOLD -a app_2 

这会将主数据库从 app_1 复制到 app_2 上的 GOLd 数据库

【问题讨论】:

  • 如果您要从一个应用程序移动到另一个应用程序,那么为什么不在新应用程序中指定旧应用程序的数据库 url。这样你的新应用就会使用旧应用的数据库
  • 你想知道更多关于如何做到这一点的信息吗?
  • 检查我的更新答案
  • 这是一篇旧帖子,但如果您还在:请从问题帖子中删除该“解决方案”,并将其粘贴到新的答案帖子中,然后接受该答案。如果答案是可以被投票并因此在搜索排名中被推高的实际答案,那么搜索 SO 的人的生活就会变得更加轻松。

标签: postgresql heroku


【解决方案1】:

根据网站,插件已折旧。所以这可能是失败消息的原因。

备份作为附加组件已被弃用。

由于您的目标是将数据库从一个应用程序移动到另一个应用程序,您为什么不尝试下面链接中提到的说明。

https://devcenter.heroku.com/articles/heroku-postgres-backups#direct-database-to-database-copies

【讨论】:

    【解决方案2】:

    如果您查看heroku docs,它会说

    PG 备份作为插件已被弃用。这些命令作为 CLI 中 Heroku Postgres 命名空间的一部分存在。新功能已上线并可供使用。

    因此您可以使用pgbackups functionality directly 而无需添加任何附加组件

    要创建备份,您可以运行

     heroku pg:backups capture --app app_name
    

    如果你有多个数据库,那么你可以像这样指定数据库 url

    heroku pg:backups capture HEROKU_POSTGRESQL_PINK
    

    restore from a backup on another app你可以跑

    heroku pg:backups restore b001 DATABASE_URL --app app_name
    

    你可以transfer database通过

    heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_PINK_URL --app app_name
    

    您也可以在另一个应用程序上upload your database to a public url and then use that url to import database

    heroku pg:backups public-url b001 --app app_name
    

    然后import它通过

    heroku pg:backups restore 'https://s3.amazonaws.com/me/items/3H0q/mydb.dump' DATABASE -a app_name
    

    如果您要从一个应用程序转移到另一个应用程序并希望将相同的数据库用于另一个应用程序,那么您可以按照以下步骤操作:

    • 登录您的 Heroku 帐户
    • 选择您的旧应用并转到设置选项卡
    • 显示旧应用的配置变量
    • 复制 DATABASE_URL
    • 返回并选择您的新应用
    • 将新应用的 DATABASE_URL 替换为旧应用值

    【讨论】:

    • 我在运行 heroku addons:add pgbackups 时遇到同样的错误!未找到附加计划。
    • 感谢您的帮助,我最终向 Heroku 发送了电子邮件,结果发现我需要更新 heroku。
    【解决方案3】:

    我遇到了一个相关问题。您可以将备份保存到本地计算机,然后将其上传到某些主机,例如 amazon s3,然后从给定的 url 导入。 这个问题和以下答案可能会对您有所帮助:Can't import to heroku postgres database from dump

    【讨论】:

    • 我可以使用 heroku pgbackups:url b1478 访问链接,但无法运行 heroku pg:backups 或 heroku pgbackups
    • @neo,它是哪个heroku堆栈?
    • 我正在从竹子转移到雪松,所以受影响的应用程序在雪松上
    • @neo,我也必须这样做。但是看起来很奇怪,您无法在 cedar 堆栈上使用 pg:backups 。我会尝试在你的地方联系 heroku 的人。
    【解决方案4】:

    现在您无需备份,只需 1 个命令即可将数据库从应用程序复制到应用程序:

    heroku pg:copy app_name_to_copy_from::database_color_to_copy_from database_color_to_copy_to --app app_name_to_copy_to
    

    查看here

    【讨论】:

      【解决方案5】:

      您可能会发现有用的 pgAdmin III (http://pgadmin.org/),这是一个免费的数据库管理工具,专门设计用于执行这些类型的任务。您可以直接从 Heroku 数据库编辑/查看/导入/导出。如果您在设置方面需要帮助,请告诉我。 (它就像 MySQL Workbench,但适用于 PostgreSQL)。

      【讨论】:

        【解决方案6】:

        我找到了一种更简单的解决方案,可以在 heroku 上与多个应用程序重用/共享相同的资源(在这种情况下是 postgres 数据库 - 或任何其他允许共享/重用的资源),它正在执行以下操作:

        1. 转到 Heroku 上较旧的(源)应用仪表板
        2. 选择“资源”标签
        3. 找到资源(这里是 postgres 数据库)
        4. 点击资源列表最右侧的计划名称旁边的图标
        5. 选择“附加到另一个应用程序”选项并从显示的列表中选择较新的(目标)应用程序名称

        Sample of the extended menu mentioned @ step #4 above!

        这就是在应用程序之间共享资源所需的全部内容,因为它会自动更新目标应用程序上的所有相关配置设置。这很方便,因为与附加组件相关的配置变量都不能直接编辑,至少从仪表板(尚未通过 CLI 检查)。希望这可以帮助任何寻找类似东西的人。

        【讨论】:

        • 我认为这可能会“共享”数据库,而不是将数据传输到另一个数据库。
        • @pixelearth 感谢您的评论。你的想法是正确的。我已经在回答中提到了这一点。对于 OP 中的既定目的,我认为如果两个应用程序可以访问同一个数据库,则应用程序可以进行进一步的转换,包括数据复制,如果需要的话。当然,这个答案不是对问题的直接回答,而是对任何有相关问题的人的替代方法的建议。
        【解决方案7】:
        heroku pg:copy app1_name::HEROKU_POSTGRESQL_ONYX_URL HEROKU_POSTGRESQL_AQUA_URL --app app2_name
        

        第二个数据库 url 在 app2_name 上的位置

        【讨论】:

        • 我经常回到这个帖子,这是正确的答案!
        【解决方案8】:

        有简单的方法可以做到这一点,也有一种快速的方法

        简单的方法通常涉及使用备份/恢复方法(包括pg:copy,这是一种将数据直接流式传输到pg_restore 进程的备份),但是这些方法在创建新数据库时速度很慢,因为您正在恢复表的逻辑定义、加载数据以及在数据上创建索引。

        工作量很大,而对于我的 30GB 标准 2 数据库来说,这可能需要几个小时。

        做到这一点的快速方法是在您想要数据的应用程序(例如测试)上提供要复制的数据库的追随者(例如生产)。在相同的 30GB 数据库上需要数小时才能进行恢复,而最后一次大约需要 15 分钟。

        我使用的方法是:

        # Get the name of the source database addon (e.g. postgresql-clean-12345)
        heroku pg:info -a production-app
        
        # Create a follower on the destination app (choose your own plan)
        # You create the follower on the new app because otherwise it is 
        # perpetually associated with the source as it's "billing app"
        heroku addons:create heroku-postgresql:standard-2 --follow postgresql-clean-12345 -a test-app
        heroku pg:wait -a test-app
        
        # Quiesce the destination app
        heroku scale web=0 worker=0 -a test-app
        heroku maintenance:on -a test-app
        
        # Get the colour of the new database (e.g. HEROKU_POSTGRESQL_GRAY_URL)
        heroku pg:info -a test-app
        
        # Unfollow the source database.
        # If you want to upgrade the database, do that now instead of the
        # unfollow.
        heroku pg:unfollow HEROKU_POSTGRESQL_GRAY_URL -a test-app
        
        # Promote the new database on the destination app
        heroku pg:promote HEROKU_POSTGRESQL_GRAY_URL -a test-app
        
        # Get the colour of the old database, if any(e.g. HEROKU_POSTGRESQL_MAROON_URL)
        heroku pg:info -a test-app
        
        # Destroy the old database (if any)
        heroku addons:destroy HEROKU_POSTGRESQL_MAROON_URL -a test-app
        
        # Bring the test app back up
        heroku scale web=1 worker=1 -a test-app
        heroku maintenance:off -a test-app
        

        为什么会更快?

        我相信在创建追随者时,Heroku 通过复制数据文件或从物理(文件)备份恢复来创建新数据库,然后重放日志以使其保持最新状态。

        【讨论】:

        • 添加我的一粒盐:做heroku pg:info -a test-app 不仅显示颜色,而且根据Heroku database update guide 显示关注和关注数据库之间的增量。两个数据库必须完全同步才能取消关注
        • 太棒了!注意:heroku pg:promote .... 不会立即为我工作,暂时抛出错误“找不到此插件的数据库 URL”。然而,几分钟后它最终确实起作用了。
        • @TomasKohl 哦,是的,似乎有时在步骤之间需要一些等待。
        • 这绝对是最好的解决方案。我遇到的唯一问题是以下错误:“数据库追随者不支持低于此领导者计划的 1 级以上”。我在生产中运行 premium-4,但我的演示站点上只需要 standard-0。
        • 看来我上面提到的错误的解决方案是在 addons:create 命令中使用 --fork 而不是 --follow 。那么你显然也可以跳过取消关注命令。
        【解决方案9】:

        我需要一些稍微不同的东西,所以在这里分享:

        heroku pg:copy name_of_app_being_copied::DATABASE_URL DATABASE_URL --app name_of_app_being_copied_to
        

        注意:不需要更改对 DATABASE_URL 的两个引用。这可能看起来很奇怪,但第一个实例引用了被复制应用程序的数据库 url,而第二个实例引用了被复制到的应用程序的数据库 url。

        【讨论】:

        • 这对我有用。但是,重要的是要注意DATABASE_URL 可能对每个人都不一样。要获取特定于您应用程序的应用程序,请运行 heroku pg:info。它将在输出的=== 之后指定。
        【解决方案10】:
        heroku addons:create heroku-postgresql:standard-0 --fork postgresql-translucent-12345 --app target-app
        

        其中 postgresql-translucent-12345 是您要从中分叉的数据库的插件名称。请注意,颜色 url 不适用于不同的应用程序,但插件名称可以。

        您还可以添加“--fast”选项:

        heroku addons:create heroku-postgresql:standard-0 --fork postgresql-translucent-12345 --fast --app target-app
        

        这会创建一个可能长达 30 小时的数据库分支。即使没有快速选项,我也在 10 分钟内复制了一个 40GB 的数据库。

        https://devcenter.heroku.com/articles/heroku-postgres-fork

        那么你当然要提升数据库。有关该过程的更多详细信息,请参阅上面 David Aldridge 的回答 - 以及我的 cmets。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          • 2014-11-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-13
          相关资源
          最近更新 更多