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

Luc*_*ano 49 postgresql heroku

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

首先我捕获了数据库:

heroku pgbackups:capture --app production-app 
Run Code Online (Sandbox Code Playgroud)

这有效:

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

Capturing... done
Storing... done
Run Code Online (Sandbox Code Playgroud)

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

heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --remote staging
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

DATABASE_URL does not match any of your databases
 !    Could not resolve database DATABASE
 !    
 !    Available databases: 
Run Code Online (Sandbox Code Playgroud)

我也尝试输入完整的URL:

 heroku pgbackups:url b238 --app production-app
 heroku pgbackups:restore DATABASE "https://s3.amazonaws.com/..." --remote staging
Run Code Online (Sandbox Code Playgroud)

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

heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app
Run Code Online (Sandbox Code Playgroud)

这些都没有奏效.有趣的是,错误消息显示没有"可用数据库".我假设它指的是临时应用程序,它确实是空的.如果我输入:

heroku pgbackups
Run Code Online (Sandbox Code Playgroud)

我明白了:

 !    No backups. Capture one with `heroku pgbackups:capture`.
Run Code Online (Sandbox Code Playgroud)

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

heroku pgbackups --app production-app
Run Code Online (Sandbox Code Playgroud)

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

我已阅读并尝试了所有答案,但没有任何效果.有任何想法吗?

Luc*_*son 84

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
Run Code Online (Sandbox Code Playgroud)

然后,当它完成后,重新启动升级:

# this is if you have workers, change '1' to whatever
heroku ps:scale worker=1 -a yourapp-staging

heroku maintenance:off -a yourapp-staging
Run Code Online (Sandbox Code Playgroud)

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

  • @LucasNelson 有什么方法可以使这个过程自动化并按计划运行吗?我不能在 Heroku dyno 中这样做,因为那里无法访问 heroku CLI! (2认同)

Tak*_*uri 20

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

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


Jon*_*son 15

更新:这不再有效.请参阅下面的@ lucas-nelson的答案.

所以事情现在变得更加容易了.结帐转移命令作为pgbackups的一部分

heroku pgbackups:transfer HEROKU_POSTGRESQL_PINK sushi-staging::HEROKU_POSTGRESQL_OLIVE -a sushi
Run Code Online (Sandbox Code Playgroud)

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

这对我将生产代码带回我的临时站点非常有效.


小智 12

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

您需要先将生产数据库附加到暂存应用程序,然后在暂存应用程序上分叉.如果你在生产应用程序上分叉,然后连接到临时应用程序,结算应用程序将是生产应用程序,你将无法从它分离分叉.

1.首先找出生产数据库的附加名称(现在是postgres-prod-123):

$ heroku addons --app myapp-production
heroku-postgresql (postgresql-prod-123)  standard-0  $50/month
 ?? as DATABASE
Run Code Online (Sandbox Code Playgroud)

2.然后生产数据库加载项附加到您的临时应用程序.给它一个名称PRODUCTION_DB,以便于识别:

$ heroku addons:attach postgresql-prod-123 --app myapp-staging --as PRODUCTION_DB
Run Code Online (Sandbox Code Playgroud)

3.然后在登台应用程序上创建生产数据库的分支:

$ heroku addons:create heroku-postgresql:standard-0 --fork PRODUCTION_DB_URL --as STAGING_DB --app myapp-staging
Run Code Online (Sandbox Code Playgroud)

4.最后将fork升级为您的临时应用程序的主数据库:

$ heroku pg:promote STAGING_DB --app myapp-staging
Run Code Online (Sandbox Code Playgroud)

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

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

$ heroku addons:detach postgresql-prod-123 --app myapp-staging
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 6

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

  • 只是为了澄清,只需替换“ you-app-production”和“ you-app-staging”。“ DATABASE”不需要替换为任何东西。 (3认同)

San*_*ati 6

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

heroku pg:copy <production_app_name>::HEROKU_POSTGRESQL_BLACK_URL OLIVE -a <staging_app_name> --confirm <staging_app_name>
Run Code Online (Sandbox Code Playgroud)


kbj*_*ing 1

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