2015-10-15 40 views
6

我有一個在Cedar-10堆棧上運行的Heroku應用程序,很快就會被棄用。我遵循Migrating to the Celadon Cedar-14 Stack指南,並在新堆棧上創建了我的應用程序實例。但是,這也會自動創建另一個(空)PostgreSQL數據庫。Heroku數據庫在其應用程序被刪除後是否存在 - 我可以將其轉移到其他應用程序嗎?

  • 我可以升級到新堆棧但繼續使用現有數據庫嗎?
  • 當我在舊堆棧上刪除應用程序時,它是否會自動刪除與其關聯的數據庫?

我看到數據庫URL在環境變量設置$DATABASE_URL - 這意味着我可以以某種方式更新和「鏈接」的舊數據庫到新的應用程序嗎?

在搜索此信息時,我遇到了heroku的pg:copypg:transfer指令,但在工作正常的情況下複製數據庫似乎很奇怪,並且已付費的「升級」和已與其關聯的備份。

+0

聽起來像是你創建一個臨時的實例。如果您刪除該實例並且空數據庫仍然存在,只需在儀表板中將其刪除即可。升級您的生產應用程序是一個完全獨立的過程。運行給定的命令並推送您的代碼。新的堆棧將被安裝並與生產數據庫交談。 – Gene

回答

2

與配置變量方法

雖然有可能在的Heroku share a database between two applications通過複製所述第一應用到所述第二的DATABASE_URL配置變量的問題,只有所述第一應用將具有主連接(添加-on)到數據庫。

如果您刪除第一個應用程序,您的數據庫將從Heroku中的postgres dashboard消失。雖然看起來第二個應用程序仍然能夠使用數據庫。 (測試2015-10-25。)

還值得一提的是:

的Heroku做保留根據需要更改數據庫URL的權利。如果發生這種情況,它會導致您的輔助連接失敗,並且您需要相應地更新URL。

這意味着,如果Heroku的決定更改URL的數據庫,新的應用程序會失敗,因爲數據庫正在從你的儀表盤了,你將無法檢索新的URL,而不接近Heroku。 (如果有的話)

這意味着應用程序與其數據庫之間存在更多的內在聯繫,而不僅僅是DATABASE_URL,並且使用它作爲傳輸機制可能不是最好的想法。


使用PGBackups

的Heroku official documentation

的替代方法建議您使用免費PGBackups附加(其中,說實話,你應該始終運行無論如何)到Postgres的實例之間傳輸數據。該工具使用本地pg_dumppg_restore工具。

特別是,你可以使用PG copy功能,如下所述:

PG副本使用本地PostgreSQL的備份和恢復工具。但是,不是將備份寫入磁盤,而是直接通過電纜將數據流傳輸到新數據庫上的還原過程。

它們方便地提供爲你的應用程序之間的數據庫複製用一個命令的裝置;和,而不需要任何中間存儲:

作爲替代方案,可以遷移掛接數據庫之間的數據適用於不同的應用

要將源數據庫複製到目標數據庫,您需要從目標應用程序調用pg:copy,並引用源數據庫。

例子:

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

哪裏source-application是現有的堆棧,並target-application新創建的一個。與您無關,但仍值得一提的是,target-application的數據庫中的任何現有數據都將被銷燬。

在此之後,可能需要推廣的數據庫在新的應用程序,像這樣:

heroku pg:promote HEROKU_POSTGRESQL_PINK 

+0

這真棒 - 謝謝你的詳細解釋 – cwd

2

您當然可以將您的configuration variables更改爲從新應用程序的數據庫指向現有數據庫。我之前做過這個沒有問題(只要確保你有一個新的備份)。

因此在您的新應用程序中運行heroku config。您將在DATABASE_URL中看到對數據庫的引用。然後,您可以更改該值:

heroku config:set DATABASE_URL=<existing-database-url> 

在這一點上你有你的舊應用程序和新的應用程序指向相同的數據庫沒有問題。正如你所說的,你需要爲現有數據庫升級數據庫,所以刪除舊應用程序不應該刪除數據庫;如果確實如此(您的備份是否正確?),這將是聯繫Heroku的時間!

如果您不習慣使用命令行,您還可以更改Heroku應用程序儀表板上應用程序的設置選項卡中的值。


有了這些說法,你實際上不需要創建一個新的應用程序來升級你的堆棧。再一次,我之前做過堆棧升級,你應該能夠做到這一點;其中the Heroku docs confirm

+0

+1謝謝! 'heroku stack:set'命令就是票!不知怎的,我以前錯過了它 - 謝謝指出它。 – cwd

2

雖然@ Drenmi的方法可能是有可能轉移數據庫「所有權」應用程序之間的最安全的選擇。 確保您先進行備份。

在Heroku數據庫中被視爲附加組件。因此,當你舉例推送一個rails應用程序時,heroku會在應用程序中添加一個postgres數據庫插件。

首先使用heroku addons獲得附插件的列表:

$ heroku addons --app old_app 

Add-on         Plan Price 
─────────────────────────────────────── ──── ───── 
heroku-postgresql (resting-fairly-4672) dev free 
└─ as HEROKU_POSTGRESQL_CYAN      

我們可以將數據庫,然後附加到新的應用程序。

heroku addons:attach resting-fairly-4672 --app new_app 

並將其從舊應用程序中分離出來。

heroku addons:detach resting-fairly-4672 -app old_app 

https://devcenter.heroku.com/articles/managing-add-ons

+0

謝謝!這真的幫助我理解數據庫和其他插件如何與heroku協同工作,以及如何通過cli管理它們 – cwd

+0

@max:不知道你可以做到這一點。偉大的發現! :-) – Drenmi

相關問題