Heroku将db从一个app转移到另一个app

时间:2015-04-20 16:30:07

标签: postgresql heroku

我需要将db从app_1转移到app_2

我在app_1上创建了备份

然后跑了:

heroku pg:backups还原HEROKU_POSTGRESQL_COLOR --app app_2 heroku pgbackups:url --app app_1

HEROKU_POSTGRESQL_COLOR = app_2的数据库网址

然后我得到:

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

所以我跑了:

heroku pgbackups:恢复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:update,但heroku 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数据库网址为:HEROKU_POSTGRESQL_GOLD

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

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

9 个答案:

答案 0 :(得分:72)

它只有1个命令将数据库从app复制到应用程序,现在你不必备份:

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

答案 1 :(得分:10)

如果你看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

你可以{/ 3}}

heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_PINK_URL --app app_name

您还可以通过

在另一个应用上transfer database
heroku pg:backups public-url b001 --app app_name

然后upload your database to a public url and then use that url to import database通过

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

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

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

答案 2 :(得分:3)

heroku pg:copy app1_name::HEROKU_POSTGRESQL_ONYX_URL HEROKU_POSTGRESQL_AQUA_URL --app app2_name

第二个数据库网址在app2_name上

答案 3 :(得分:1)

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

  

作为加载项的备份已被弃用。

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

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

答案 4 :(得分:1)

我发现在heroku上使用多个应用程序重用/共享相同资源(在这种情况下为postgres数据库或任何其他允许共享/重用的资源)的简单解决方案正在执行以下操作:

  1. 转到Heroku上的旧(源)应用程序信息中心
  2. 选择“资源”标签
  3. 找到资源(postgres数据库,在我们的例子中)
  4. 点击列出资源的行的最右侧部分的计划名称旁边的图标
  5. 选择“附加到其他应用”选项,然后从显示的列表中选择较新的(目标)应用名称
  6. Sample of the extended menu mentioned @ step #4 above!

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

执行此操作的方法很简单,执行此操作的方法也很快速

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

这是很多工作,而对于我的30GB standard-2数据库,它可能要花几个小时。

执行此操作的快速方法是在要用于数据(例如测试)的应用程序上设置要复制(例如生产)数据库的跟随者。在同样需要30个小时才能恢复的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通过复制数据文件或从物理(文件)备份还原来创建新数据库,然后重播日志以使其保持最新状态。

答案 8 :(得分:0)

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

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

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