60

在 Heroku 上,我正在尝试使用 pgbackups 插件将生产数据库复制到我的登台应用程序中。我按照插件页面上的说明进行操作:https ://devcenter.heroku.com/articles/pgbackups

首先我捕获了数据库:

heroku pgbackups:capture --app production-app 

那行得通:

HEROKU_POSTGRESQL_PURPLE (DATABASE_URL)  ----backup--->  b238

Capturing... done
Storing... done

但是,当我尝试在登台应用程序上恢复它时:

heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --remote staging

我收到以下错误消息:

DATABASE_URL does not match any of your databases
 !    Could not resolve database DATABASE
 !    
 !    Available databases: 

我还尝试输入完整的 URL:

 heroku pgbackups:url b238 --app production-app
 heroku pgbackups:restore DATABASE "https://s3.amazonaws.com/..." --remote staging

并尝试命名应用程序(而不是--remote staging):

heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app

这些都不起作用。有趣的是,错误消息显示没有“可用数据库”。我假设它指的是确实是空的登台应用程序。如果我输入:

heroku pgbackups

我得到:

 !    No backups. Capture one with `heroku pgbackups:capture`.

要查找可用的备份(生产),我需要输入:

heroku pgbackups --app production-app

我得到了当前备份的列表。我不知道这是否正常,或者即使它与问题有关,但我认为我应该提一下。

我已经阅读并尝试了这里的所有答案,但没有任何效果。有任何想法吗?

4

12 回答 12

96

2017 年年中更新(从Takehiro Mouri的答案中窃取 - 简化 DATABSE_NAME 部分)

2015年年中更新...

pgbackups 插件已被弃用。没有了pgbackups:transfer

要将数据库从yourapp复制到yourapp_staging

# 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
heroku pg:copy your-app::DATABASE_URL DATABASE_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

(来源:https ://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#upgrade-with-pg-copy-default )

于 2015-05-28T00:47:03.720 回答
25

更新:您可以运行此命令将数据库从生产转移到登台: heroku pg:copy your-app::DATABASE_URL DATABASE_URL -a yourapp-staging

它将提示您确认操作,一旦您完成此操作,所有数据都将被迁移。

于 2016-10-11T03:46:16.080 回答
15

更新:这不再有效。请参考下面@lucas-nelson 的回答

所以现在事情变得更容易了.. 签出传输命令作为 pgbackups 的一部分

heroku pgbackups:transfer HEROKU_POSTGRESQL_PINK sushi-staging::HEROKU_POSTGRESQL_OLIVE -a sushi

https://devcenter.heroku.com/articles/upgrade-heroku-postgres-with-pgbackups#transfering-databases-between-heroku-applications

这对我将生产代码带回我的暂存站点非常有用。

于 2014-06-03T00:43:28.267 回答
15

这是一个使用 Heroku 的附加附件和分叉的简单而安全的解决方案。它不需要备份、没有停机时间,也不会覆盖任何数据库。

您需要先将生产数据库附加到 staging 应用程序,然后再在 staging 应用程序上分叉。如果您在生产应用程序上分叉,然后附加到暂存应用程序,则计费应用程序将成为生产应用程序,您将无法将分叉与其分离。

1.首先找出你的生产数据库的插件名称(这里是postgres-prod-123):

$ heroku addons --app myapp-production
heroku-postgresql (postgresql-prod-123)  standard-0  $50/month
 └─ as DATABASE

2.然后生产数据库附加组件附加到您的登台应用程序。给它起一个名字PRODUCTION_DB,以便于识别:

$ heroku addons:attach postgresql-prod-123 --app myapp-staging --as PRODUCTION_DB

3.然后在 staging 应用上创建生产数据库的 fork :

$ heroku addons:create heroku-postgresql:standard-0 --fork PRODUCTION_DB_URL --as STAGING_DB --app myapp-staging

4.最后将 fork 提升为 staging 应用程序的主数据库:

$ heroku pg:promote STAGING_DB --app myapp-staging

完毕!您的登台应用程序现在正在使用您的生产数据库的副本。请注意,您之前的暂存数据库仍然存在,您可能希望在确保一切正常后将其销毁。

要清理,请从暂存应用程序中分离生产数据库:

$ heroku addons:detach postgresql-prod-123 --app myapp-staging
于 2016-08-26T07:20:49.563 回答
8

这对我有用: heroku pg:copy you-app-production::DATABASE DATABASE -a you-app-staging

于 2016-09-27T23:21:43.043 回答
4

您可以使用以下命令执行此操作

heroku pg:copy <production_app_name>::HEROKU_POSTGRESQL_BLACK_URL OLIVE -a <staging_app_name> --confirm <staging_app_name>
于 2019-06-27T04:59:47.457 回答
1

首先创建一个最新的生产备份:

heroku pgbackups:capture -a productionappslug --expire

找出 Heroku 为您的数据库命名的颜色。

https://postgres.heroku.com/databaseshttps://dashboard.heroku.com/apps/STAGINGAPPSLUG/resources

然后将生产数据库备份加载到暂存中(将 RED 更改为您的任何颜色):

heroku pgbackups:restore HEROKU_POSTGRESQL_RED -a stagingappslug `heroku pgbackups:url -a productionappslug`

stagingappslugliveappslug是你的 heroku 应用程序的简称。

于 2013-12-05T09:35:36.307 回答
1

我在同样的问题上苦苦挣扎。根据这个问题的答案,问题可能出在您的 heroku gem 版本上。我刚刚升级了我的版本(从 2.26.2 到 2.26.6),现在它可以工作了。

于 2012-06-06T13:40:16.813 回答
1

要将生产数据库(数据库)传输(复制)到临时数据库(目标数据库),您需要pg:copy目标应用程序调用,并引用数据库。

heroku pg:copy source-application::OLIVE HEROKU_POSTGRESQL_PINK -a target-application

另一个例子:

heroku pg:copy my-production-app::HEROKU_POSTGRESQL_OLIVE HEROKU_POSTGRESQL_PINK --app my-staging-app

要获取数据库的颜色名称,请使用:

heroku pg --app my-production-app
heroku pg --app my-staging-app

pg:copy

于 2015-06-02T22:49:58.133 回答
0

在没有运气之后。(我使用heroku gem 2.31.4)我做了以下(帮助疲惫的人)

  1. 登录 Heroku 数据库控制台

  2. 登录到 staging > 'settings' > PGRestore > 将“Connection Settings”复制到一个文本文件中。

  3. 登录到生产 > 快照,按“+”立即进行新备份。然后按下载。下载到应用程序 /tmp 文件夹或任何你想要的地方。

  4. 将登台设置为维护模式

    $ heroku 维护:开启

  5. 像这样运行命令,最后带有连接设置文本和转储文件: PGPASSWORD={...bits of stuff here...} -p 5432 'tmp/b048.dump.dump'

  6. 运行后:

    $ heroku 维护:关闭

  7. 登录登台并检查是否匹配。如果可以通过,找到您知道正在生产中的最近交易。$ heroku 为两个应用程序运行控制台并检查 ids 是否匹配。

于 2012-09-21T07:15:22.113 回答
0

我认为它不是 --remote 它的 --app 试试这个:

heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app
于 2013-11-28T14:42:43.933 回答
0

这对我有用

  • 从 heroku 控制台下载备份并将其上传到 s3。
  • heroku pg:backups restore 'DUMP_FILE_URL_FROM_S3' DATABASE --app MY_APP
于 2015-10-30T04:21:18.707 回答