2012-05-20 15 views
36

在Heroku上,我試圖使用pgbackups addon將生產數據庫複製到我的登臺應用程序中。我跟着插件頁面上的說明:https://devcenter.heroku.com/articles/pgbackups如何使用pgbackups將生產數據庫轉儲到Heroku上?獲取錯誤

首先我拍攝的DB:

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分期)應用:

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

我一直在努力解決同樣的問題。根據this question的回答,問題可能是你的英雄寶石版本。我剛剛升級了我的版本(從2.26.2到2.26.6),現在它可以工作。

+1

我能夠通過升級數據庫來解決問題。看起來默認的5MB是不夠的。 – Luciano

0

之後沒有運氣。 (IM使用Heroku的寶石2.31.4) 我做了以下(幫助疲憊的)

  1. 登錄到Heroku的數據庫控制檯

  2. 登錄分期> '設置'> PGRestore>複製「連接設置'到文本文件中。

  3. 登錄到生產>快照,按'+'進行備份。然後按下載。將 下載到應用程序/ tmp文件夾或任何你想要的。

  4. 集轉移到維護模式

    $ Heroku的維護:對

  5. 運行,像這樣的命令,以連接設置的文本,並在年底轉儲文件:東西PGPASSWORD = {...位這裏...} -p 5432 'TMP/b048.dump.dump'

  6. 運行後:

    $ Heroku的維護:關閉

  7. 登錄登臺並檢查事物是否匹配。 如果您可以通過,查找您知道生產的最近交易。 $ heroku爲兩個應用程序和檢查ID匹配運行控制檯。

0

我認爲它不是--remote其--app試試這個:

heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app 
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應用程序被調用。

15

更新:這不再起作用。請參閱下面的@ 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

的一部分。

+0

這應該被標記爲正確答案! – mhenrixon

+0

根據http://stackoverflow.com/questions/3850299/transfer-db-from-one-heroku-app-to-another-faster#comment46883073_24005424,它會破壞原始數據庫,不是嗎? –

+0

該文檔沒有說明它是否會摧毀目標數據庫中的部分或全部數據。對於我來說,執行備用實施足夠快,因此我確實做到了。 –

64

更新 - 2017年中期(從武廣毛利的回答偷 - 簡化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

+0

在'heroku pg:copy'期間,這個新過程(相對於將prod中已經生成的備份應用於分段)是否會對主數據庫施加任何額外壓力? – imderek

+1

我的用例不夠大,無法確定。我看不出有關它的任何文檔(除了估計該過程每GB數據需要3分鐘)。 由於不需要現有備份,因此您必須假定該進程在複製的大部分時間段內都會在源數據庫上放置讀取IO負載。 –

+0

這應該是被接受的答案。 –

0

轉讓(複製)生產數據庫(數據庫)的分期數據庫(目標數據庫),則需要從目標應用調用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

0

這就是我的工作

  • 從heroku控制檯下載備份並上傳到s3。
  • heroku pg:backups restore 'DUMP_FILE_URL_FROM_S3' DATABASE --app MY_APP
7

這裏有一個簡單,安全的解決方案,這一點使用Heroku的附加附件和分叉。它不需要備份,也不需要停機,並且不會覆蓋任何數據庫。

您需要首先將生產數據庫附加到登臺應用程序,然後在登臺應用程序上進行分叉。如果您在生產應用程序中分叉,然後附加到登臺應用程序,結算應用程序將是生產應用程序,並且您將無法從其分離叉子。

先找出附加生產數據庫的名稱(這裏是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.最後推動叉是暫存應用程序的主數據庫:

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

完成!您的登臺應用程序現在正在使用您的生產數據庫的副本。 請注意,您之前的臨時數據庫仍然存在,您可能希望在確定一切正常後立即將其銷燬。

進行清理,從籌劃應用分離生產數據庫:

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

最好的辦法IMO – MrE

+0

這是非常有幫助的。它看起來像你現在也可以在界面中(在資源的Heroku數據庫頁面中)分叉。 –

+0

@BradBumbalough是的,你可以在UI中分叉,但是當我嘗試分叉時,卻將結算應用程序保留在原始應用程序上,以至於無法使用。您可以執行UI中的大部分步驟,但分叉步驟似乎需要在CLI中完成 – MrE

2

這個工作對我來說: heroku pg:copy you-app-production::DATABASE DATABASE -a you-app-staging

12

UPDATE: 您可以運行此命令將數據庫從生產轉移登臺: heroku pg:copy your-app::DATABASE_URL DATABASE_URL -a yourapp-staging

它會提示您確認操作,一旦您完成該操作,所有數據將被遷移。

相關問題