2016-12-06 42 views
1

我是編程新手。我在生產中使用Rails 4和Postgres作爲數據庫。當我更改數據庫結構時,使用Capistrano進行部署時更新生產數據庫的最佳做法是什麼?我想保留生產中的所有數據。更新生產數據庫的最佳實踐?

我注意到有時當我更改模式並部署到生產環境時,現有的一些數據記錄丟失了。

+2

第一步:根本不要這樣做,直到您有連續的備份和存檔。 –

回答

1

通常你」將使用rails g migration產生新的遷移,然後做這樣的事情:

class AddUsersDiscountToken < ActiveRecord::Migration 
    def change 
    add_column :users, :discount_token, :string 
    end 
end 

這種遷移會discount_token列添加到users表可應用於:

rake db:migrate 

在Capistrano的還有一旦部署成功,將做到這對你的任務。除了介紹這個新領域之外,不應丟失任何數據,也不會改變記錄。如果發生其他事情,你的遷移中會出現一些非常奇怪的事情。

記住,一些規則:

  • 始終備份你使用正確的工具應用任何遷移之前的數據。 mysqldump是一個很好的開始。複製二進制MySQL數據文件是不夠的,如果可以的話,將無法可靠地工作。
  • 總是測試你的備份並確保一切都在那裏。備份過程可能由於某種原因而提前終止,並且無法正確備份所有表和數據。
  • 從不在您的實際生產數據庫上部署遷移,而不先在拷貝上進行測試。這是備份派上用場的地方,您有機會恢復它,運行遷移並測試結果。

這就是爲什麼使用臨時服務器通常很方便,即使它只是臨時服務器,或者不如生產服務器強大。它允許您在實際生產數據上測試遷移,而不會中斷服務。使用新遷移的生產數據庫運行新的生產代碼,並驗證已添加的新功能是否正常運行,並檢查是否沒有破壞任何舊迴歸的代碼。請記住,改變大型表(例如具有數百萬行的表)的模式的遷移可能需要一些時間才能完成,特別是在具有非SSD支持的數據庫的服務器上。在分級系統上進行測試時,請記下完成所需的時間,因爲您可能需要提前通知您的用戶進行定期維護,或對計劃進行更改,以減少遷移方面的干擾。

0

除非您刪除表格或刪除列migrations永遠不會導致您的任何問題。

爲了避免某些遷移相關的問題請確保您有以下這一點:

  1. 如果可能嘗試重命名tablecolumn不是刪除和創建具有相同結構的表。
  2. 檢查您的遷移是否爲reversible以防您需要回滾
  3. 如果您正在編寫腳本以更新數據庫,請確保您已準備好counter-script
  4. 最重要的瞭解遷移正好做交叉驗證它臨時環境,以確保您不會失去你的數據 - 讓改變你的架構時通過@CraigRinger
+2

在執行之前閱讀提議的遷移。然後在登臺服務器上執行它並查看它做了什麼,驗證結果。然後才考慮生產。 –

+0

@CraigRinger這是一個很好的觀點 –