2010-10-03 56 views
41

將生產數據庫轉移到測試應用程序有更快的方法嗎?將數據庫從一個heroku應用程序轉移到另一個應用程序更快

目前我正在爲我的本地機器做heroku db:pull,然後heroku db:push --app testapp,但這會變得非常耗時。我有一些種子數據,但它不像使用我的真實世界數據測試那麼準確。由於它們都存儲在相鄰的AWS雲上,因此必須有更快的方式來移動數據?

我想過使用一個heroku包,但我注意到animate命令不見了?

bundles:animate <bundle>  # animate a bundle into a new app 
+0

旁註:Heroku的束和捆紮機是分開的,不相關的概念。 – tfe 2010-10-05 06:40:41

+0

嗯,當我寫這些時,我甚至都沒有想過這種可能的混淆。 – holden 2010-10-05 13:54:49

回答

0
psql -h test_host -c 'drop database test_db_name; create database test_db_name;' 

pg_dump -h production_host production_db_name | psql -h test_host test_db_name` 

這可以在production_hosttest_host —將是雙向的完成。

+0

這將非常緩慢,除非數據庫和機器運行'pg_dump ... | psql ...'在同一個EC2區域。 – jelder 2015-06-02 22:29:57

0

沒有測試過這個,但它可能工作。

這樣做是爲了讓你的源數據庫的URL:

heroku console "ENV['DATABASE_URL']" --app mysourceapp 

然後嘗試執行db:push這一點。

heroku db:push database_url_from_before --app mytargetapp 

如果Heroku不允許從網絡外部訪問數據庫機器,這可能無法正常工作。你也許可以嘗試在你的應用程序代碼中使用水龍頭(heroku db命令在內部使用的gem)(也許是一個rake任務)。這將比上述方法更快,因爲所有內容都完全保留在AWS內。

編輯:

下面是一個(當然哈克)的方式做上述I:

抓取數據庫的URL,如上面的第一個代碼段。然後從一個rake任務(你可以在控制檯上執行它,但是你有可能在console命令中運行超過30秒的超時限制),執行一個shell命令來輕敲(無法輕易確定是否可以直接從Ruby使用tap;全部文檔顯示使用CLI):

`taps pull database_url_from_source_app #{ENV['DATABASE_URL']}` 

反引號是重要的;這就是Ruby如何表示一個shell命令,它是什麼。希望可以從應用程序訪問tap命令。這樣可以避免從Heroku外部訪問數據庫機器的問題,因爲您在應用程序中運行此命令。

+0

龍頭現在已經被棄用很長一段時間了。 – jelder 2015-06-02 22:28:07

86

這是很常見的分期遷移,測試和生產環境之間數據庫的Rails應用。而heroku db:pull/push是痛苦的緩慢。目前爲止我發現的最好方法是使用Heroku PG Backups add-onit's free。我也跟着下面的步驟來遷移 生產數據庫到臨時服務器:

1)創建用於生產應用DB

heroku pg:backups capture --app production-app 

這將從主數據庫(通常是生產數據庫中生成B001備份文件備份數據庫。陽明海運)

2)要查看所有的備份(可選)

heroku pg:backups --app production-app 

3)現在使用PG:備份恢復命令來填充從上次備份文件生產服務器上臨時服務器數據庫

heroku pg:backups restore $(heroku pg:backups public-url --app production-app) DATABASE_URL --app staging-app 

請記住,還原是一種破壞性操作,它會在刪除現有數據之前用備份文件的內容替換它。

+4

快速注意,此過程不會刪除並重新創建模式。這意味着如果你在臨時表中有額外的表,它們在恢復後仍然會在那裏。如果希望表消失,則需要執行db:schema:load(或其他命令)來重新創建模式。 – Mainguy 2012-08-21 16:52:53

+1

我得到了!執行此操作時未找到備份。你知道什麼是問題嗎? – patrick 2012-12-08 01:05:09

+0

@patrick如果您的登臺應用程序只有1個數據庫,您可以省略DATABASE。 – ckbhodge 2013-03-16 03:00:17

13

所以事情更容易現在..檢出轉移命令,這美麗的工作對我來說服用生產代碼回到我的臨時站點pgbackups

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

https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#4b-alternative-transfer-data-between-applications

的一部分。

+3

是的,但這會破壞原始分貝。我會使用pg:copy而不是 – blushrt 2015-03-30 14:22:49

+0

'pg:backups restore'也會破壞原始數據庫(參見[這裏](https://devcenter.heroku.com/articles/heroku-postgres-backups#restoring-backups)):「不像與以前的pgbackups命令一樣,您不能將部分備份還原到現有數據庫中。運行pg:backups restore時,在還原備份之前,將從目標數據庫中刪除所有數據。 – gabe 2015-10-27 21:33:35

+0

@gabe'pg:backups restore'不會破壞原始數據庫。你提到的報價表示它將刪除* target * DB中的所有數據,而不是來源。 – jhirsch 2016-10-11 18:25:59

0

Heroku使您能夠在生產中分叉現有的應用程序。使用heroku fork來複制現有的應用程序,包括加載項,配置變量和Heroku Postgres數據。

按照在Heroku上的說明:https://devcenter.heroku.com/articles/fork-app

+0

這對於任何重要規模的應用程序都不可用。這是昂貴的,需要永遠複製你(可能很多)的數據庫。 – jelder 2015-06-02 22:26:21

10

更新2015年中期...

的pgbackups附加已被棄用。沒有更多pgbackups:transferpg:copy是此場景的理想選擇。 HEROKU_POSTGRESQL_PINK_URL到yourapp_staging(例如數據庫名稱:

yourapp(例如數據庫名稱複製數據庫HEROKU_POSTGRESQL_WHITE_URL)

# 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 to splat over the top of the staging database 
heroku pg:copy yourapp::HEROKU_POSTGRESQL_PINK_URL HEROKU_POSTGRESQL_WHITE_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 

提醒:你可以用heroku pg:info -a yourapp-staging(和yourapp)來獲取數據庫常量。

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

相關問題