如何使用 pgbackups 将生产数据库转移到 Heroku 上暂存?得到错误

Posted

技术标签:

【中文标题】如何使用 pgbackups 将生产数据库转移到 Heroku 上暂存?得到错误【英文标题】:How do I transfer production database to staging on Heroku using pgbackups? Getting error 【发布时间】:2012-05-27 06:25:21 【问题描述】:

在 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: 

我也尝试过输入完整的网址:

 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

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

我已经阅读并尝试了关于 SO 的所有答案,但没有任何效果。有什么想法吗?

【问题讨论】:

【参考方案1】:

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)

【讨论】:

heroku pg:copy 期间,这个新过程(与将已生成的备份从 prod 应用到 staging 不同)是否会对主数据库施加任何额外压力? 我的用例不够大,无法确定。我在他们的文档中看不到任何关于它的内容(估计该过程每 GB 数据需要 3 分钟)。鉴于不需要现有备份,您必须假设该过程在复制的大部分时间段内将读取 IO 负载放在源数据库上。 我无法在 pg:info 的输出中轻松找到数据库名称。是“附加”字段吗? ... 回答:是的。 db 名称不再像那些颜色了,它们有很长的小写单词和数字 @LucasNelson 有没有办法自动化这个过程并按计划运行?我不能在 Heroku dyno 中这样做,因为那里无法访问 heroku CLI!【参考方案2】:

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

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

【讨论】:

这是否意味着数据库结构将与生产中的相同?换句话说,它会只复制数据还是从头开始重新创建数据库.. 表、字段? 它看起来像是对所有表和数据进行了完全迁移,首先将所有数据放在暂存数据库中。【参考方案3】:

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

所以现在事情变得更容易了.. 签出传输命令作为 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

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

【讨论】:

按照***.com/questions/3850299/…的说法,会破坏原来的数据库,不是吗? 文档没有明确说明它是否会破坏目标数据库中的部分或全部数据。它对我来说已经足够快了,所以我做了一个替代实现......跨度> 这不再有效,请在下面投票@lucas-nelson 的回答。【参考方案4】:

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

您需要先将生产数据库附加到 staging 应用,然后在 staging 应用上 fork。 如果您在生产应用上 fork,然后附加到 staging 应用,计费应用将是生产应用程序,您将无法从中分离叉子。

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

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

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

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

3. 然后create a fork 暂存应用程序上的生产数据库:

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

4. 最后将 fork 提升为暂存应用的主数据库:

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

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

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

$ heroku addons:detach postgresql-prod-123 --app myapp-staging

【讨论】:

最好的方法 IMO 这很有帮助。看起来您现在也可以在 UI 中分叉(在资源的 Heroku 数据库页面中)。 @BradBumbalough 是的,您可以在 UI 中分叉,但是当我尝试分叉但将计费应用程序保留在原始应用程序上时,这不起作用。您可以在 UI 中完成大部分步骤,但分叉步骤似乎需要在 CLI 中完成 分叉仅适用于生产层服务器。爱好者,请注意【参考方案5】:

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

【讨论】:

只是为了澄清只需要替换you-app-productionyou-app-staging。 “DATABASE”不需要替换成任何东西。【参考方案6】:

你可以使用下面的命令来做到这一点

heroku pg:copy <production_app_name>::HEROKU_POSTGRESQL_BLACK_URL OLIVE -a <staging_app_name> --confirm <staging_app_name>

【讨论】:

【参考方案7】:

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

【讨论】:

我可以通过升级数据库来解决这个问题。看来默认的 5MB 还不够。【参考方案8】:

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

heroku pgbackups:capture -a productionappslug --expire

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

https://postgres.heroku.com/databases 要么 https://dashboard.heroku.com/apps/STAGINGAPPSLUG/resources

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

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

stagingappslugliveappslug 是您的 heroku 应用的简称。

【讨论】:

【参考方案9】:

生产数据库(source数据库)转移(复制)到staging数据库(target数据库) 您需要从 target 应用程序调用 pg:copy,引用 source 数据库。

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

【讨论】:

【参考方案10】:

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

    登录 Heroku 数据库控制台

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

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

    将登台设置为维护模式

    $ heroku 维护:开启

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

    运行后:

    $ heroku 维护:关闭

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

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

这对我有用

从heroku控制台下载备份并上传到s3。 heroku pg:backups restore 'DUMP_FILE_URL_FROM_S3' DATABASE --app MY_APP

【讨论】:

以上是关于如何使用 pgbackups 将生产数据库转移到 Heroku 上暂存?得到错误的主要内容,如果未能解决你的问题,请参考以下文章

我们如何解决将 Access DB 从生产服务器转移到实时的日期时间问题

如何将 google play 和 testflight 中的 beta 用户转移到生产应用程序

将 iOS 应用从 Cloudkit 开发转移到生产

heroku pgbackups:restore: 无效的转储格式

Laravel:将项目转移到生产[关闭]

CloudKit:将记录从开发转移到生产