2013-02-08 104 views
2

這可能是任何團隊在某個時候都會遇到的,所以我依靠其他人的經驗。Mysql實時數據庫遷移

我們正在將舊的MySQL數據庫遷移到一個新的數據庫,其結構有很大的變化。有些表被拆分成多個較小的表,有些數據從多個較小的表連接到一個較大的表。

我們進行了測試,它需要幾個小時到數據庫遷移到一種新的形式。問題是,舊數據庫是我們的生產數據庫,每分鐘都在變化。我們不能有幾個小時的停機時間。

你覺得哪種方法會出現這樣的情況是好的?

比方說,你有表名爲「用戶」用1M行。它每秒都在變化。一些字段被更新,一些行被添加並且一些行被刪除。這就是爲什麼我們無法在某個時間點製作快照的原因,因爲遷移完成後,我們將有3小時的數據未確定。

回答

0

有一種方法我曾經使用過,也適用於您,但是您需要修改您的生產數據集。只需簡單地說:

  1. 爲每個要遷移的表添加一個名爲「migrated」(或這樣)的新列。給它一個布爾類型。默認情況下將其設置爲0。
  2. 當您的遷移腳本運行時,必須將此標誌設置爲1,以便每個已遷移到新數據庫的條目。所有已經是「1」的條目都必須被忽略。這樣你就不會遇到同步問題。

這樣您就可以隨意運行遷移腳本。

您將有一個停機時間,但它只是一個最小的停機時間,因爲在停機時間內,您只需遷移一些數據集(實際上是遷移腳本的最後一次運行和現在之間的最後一個「增量」)。

+0

非常感謝您的回覆。我已經考慮過相同的方法,但問題是 - 這隻適用於添加新行的表。如何知道行是否被刪除或數據集中間的某處發生了變化? – Mathew 2013-02-08 13:34:28

+0

要跟蹤數據集中的更改,我通常在每個數據集中都有版本控制列。在每次更改(UPDATE)時,此值都會遞增。您可以輕鬆比較生產數據庫和遷移數據庫之間的數據。對於已刪除的行,恐怕在停機時間內您必須進行一些比較。基於PKs,應該不會花太長的時間才能找出生產中已刪除的行,並在遷移的DB上刪除它們。 – 2013-02-08 13:59:53

0

你能並行運行與當前一個新的數據庫?這樣,您可以稍後將舊數據從舊數據庫遷移到新數據庫,並且您的「實時」情況將在新數據庫中捕獲。

我的意思是:當你給舊數據庫寫點東西時,你也必須將數據寫入新數據。我已經在過去使用

+0

謝謝你的建議。這是我們考慮過的問題,但問題是,在某些情況下,我們實際上有數百個地方正在更改一張表,因此需要花費太多時間和可能出現的錯誤才能這樣做。在更有組織的代碼中,我確實認爲這將是一個可行的解決方案。 – Mathew 2013-02-08 13:48:24

1

一種方法是使用replication.

我們創建了舊的生產數據庫,這是用於數據遷移的奴隸之間的複製方案。當我們開始遷移時,我們暫時關閉了複製,並使用從數據庫作爲遷移的數據源;舊的生產系統仍然運作。

遷移腳本完成並且我們的一致性檢查已運行後,我們重新啓用了從舊生產系統到複製從屬系統的複製。複製完成後,我們在生產過程中掛上了「維護維護」標誌,重新運行數據遷移腳本和一致性檢查,將系統指向新數據庫,並取下「維護」標誌。

有停機時間,但它是幾分鐘,而不是數小時。

這取決於您的數據庫模式,以便識別更改/新數據。

如果您的模式不適合查詢新的或已更改的記錄,並且您不想添加新列以跟蹤此情況,最簡單的解決方案是創建單獨的表以跟蹤遷移狀態。

例如:

TABLE: USERS (your normal, replicated table) 
---------------------- 
USER_ID 
NAME 
ADDRESS 
..... 


TABLE: USERS_STATUS (keeps track of changes, only exists on the "slave") 
----------------- 
USER_ID 
STATUS 
DATE 

你可以通過在用戶表中的觸發器插入填充此表,刪除和更新 - 爲每個動作,您可以設置一個獨立的狀態。

這使您可以快速查找自運行第一個遷移腳本後發生更改的所有記錄,並且只遷移這些記錄。

由於您沒有修改生產環境,觸發器僅在「從屬」環境中觸發,因此不應在生產環境中引入任何性能或不穩定性問題。

+0

這裏的關鍵是「這取決於您的數據庫模式,以便識別更改/新數據。」如果表中有幾百萬條記錄,則需要一段時間才能查看所有記錄並查看更改的數據。但這已經指明瞭我正確的方向。也許我們可以在重新開啓複製之後以某種方式使用從屬中繼日誌文件。 – Mathew 2013-02-08 14:14:19

+0

查看編輯 - 有些方法可以識別已更改的數據,但這取決於原始模式 - 如果您沒有主鍵,它會非常棘手...... – 2013-02-08 14:30:42

+0

是的,這是一個很好的解決方案 - 至少對於我案件。即使沒有主鍵,我們也可以添加它們,但總的來說有。像這樣的東西確實出現在我的腦海裏,但在一個活的分貝。複製和從屬介紹很棒。謝謝!! – Mathew 2013-02-08 16:57:34