2011-09-14 66 views
1

我有一個簡單的rails支持的應用程序,每天從Heroku Ronin數據庫中運行2-3百萬次綜合瀏覽量。然而,數據庫上的負載非常輕,而且它可以處理的數量遠遠超過我們的投入。在活動數據庫上運行遷移安全嗎?

我是否安全地運行遷移以將表添加到此數據庫而不進入維護模式?另外,運行遷移以將幾列添加到負責幾乎所有讀取和寫入的核心表中是否安全?

即使幾分鐘,停機時間也是不可接受的。

如果不是可行的遷移遷移,我可能要做的就是建立一個新的數據庫,運行遷移,編寫腳本來同步兩個數據庫,然後將應用程序指向新的數據庫。

但我寧願避免,如果可能的話。 :)

+1

錯誤 - 是不是Heroku Ronin一個pg數據庫?不是mysql。 –

+0

確實,謝謝你指出@OmarQureshi!爲了後人的緣故,我將mysql標記更改爲postgresql標記。 – jpadvo

回答

5

聽起來像是你的遷移包括:

  • 添加新表(也許索引如果是這樣,這可能需要更長的時間比你想象的?)
  • 添加新列(默認值和/或可爲空?)
  • 包裝的更改在事務()

建議您評估您的更改將通過對你的PROD環境的影響:

  • 採取PROD的備份(包括所有內PROD數據)針對
  • 運行您更改腳本。時間每個操作

餘額的2點上方對典型的閱讀在你希望運行這個時間&寫負載(02:00,對吧?)。

考慮通過禁止(以某種方式)寫入正在執行的表的操作來實現'軟'停機時間。

總的來說(或一般情況下),在現有表中添加n個表和新的可空列可能/可能會在沒有任何停機或性能影響的情況下完成。

始終測量您的更改對產品副本的影響。在您將更改應用到此副本時測量「響應性」。當然這意味着部署Prod應用程序的另一個副本,但這些努力是值得的。

+0

對於遷移的持續時間,數據庫是否無響應? – jpadvo

1

添加表不應該是一個問題,因爲您的應用程序將不知道它們,直到適當的升級完成。至於將列添加到核心表,我不太確定。如果您確實需要防止停機時間,那麼最好添加一個輔助表(通過ID與核心錶鏈接)來添加額外的列。

只是我的兩分錢。

2

假設它是一個pg數據庫(它應該用於Heroku)。

http://www.postgresql.org/docs/current/static/explicit-locking.html

alter table將獲取門禁專用鎖。所以,表將被鎖定。

最重要的是,您將需要重新啓動Rails應用程序,以便知道任何新模型。如果您打算將表格添加到應用程序或以任何方式修改模型代碼。

至於指向帶有新修改的數據庫的新應用程序,您將如何執行數據同步,並在同步時間同步兩個數據庫之間的數據更改?

+0

謝謝奧馬爾,那正是我想知道的。我得到的是改變表格是絕對不會的,但添加一個新表格不會鎖定整個數據庫。對? 所以我只需要擔心Heroku重新啓動和所有的...... – jpadvo

+0

確實,創建表不會執行鎖定。 –

+0

太棒了。我想我會做的只是添加表格並通過索引鏈接它們。如果我確實需要更換桌子,我會用所需的結構製作一張新桌子,將它鏡像到舊桌子上,然後切換。感謝奧馬爾! – jpadvo