2014-01-06 52 views
5

這兩個數據庫具有相同的模式,但數據不同。可能會有一些行重複,但足以讓合併保持喧鬧,如果找到重複項,則不進行更新,即應手動解決重複項。將兩個不同的Postgresql數據庫合併到單個數據庫

問題的一部分是有問題的數據庫中存在一些外鍵約束。另外,可能有一些引用實際上沒有外鍵約束的外鍵的列。後者是由於插入時的性能問題。另外,我們需要能夠在舊數據庫的ID和新數據庫中的ID之間進行映射。

顯然,我們可以寫一堆代碼來處理這個問題,但我們正在尋找一個解決方案是:

  1. 較少的工作
  2. 開銷少的機器上執行合併。
  3. 更可靠。如果我們必須編寫代碼,它將需要通過測試等,並且不能保證無缺陷

很明顯,我們仍在搜索Web和Postgresql文檔的答案,迄今爲止發現的一直沒有幫助。

更新:我明確忽略的一件事是「重複」由模式中的唯一約束明確定義。我們希望恢復一個數據庫的內容,然後恢復一秒鐘的內容。第二次恢復期間的錯誤應該被認爲對第二次恢復是致命的。然後應該從第二個數據庫中刪除重複項並創建一個新的轉儲。我們希望ID被重新編號,但不是其他唯一的約束。順便說一下,可能會有第三個甚至第四個數據庫在第二個之後合併。

回答

3

編寫一堆腳本沒有捷徑......這實際上不能自動執行,因爲管理衝突需要應用對您的數據特定的規則。

這就是說,你可以通過刪除重複的代理鍵減少衝突的可能性...

說你的兩個數據庫都只有兩個表:A (id pkey)B (id pkey, a_id references A(id))。在第一個數據庫中,找到max_a_id = max(A.id)max_b_id = max(B.id)。如果需要的話

  1. 修改表B,使用a_id確實級聯更新:

    在第二個數據庫。

  2. 禁止觸發器如果任何有副作用,可能在錯誤地踢。
  3. 更新和設置id = id + max_a_id,和同類的事情B.
  4. 導出數據

接下來,該進口數據到第一個數據庫中,並相應地更新序列。

如果ID最終可能超過23億,並且可能存在於兩個數據庫中的唯一密鑰,則仍然需要警惕溢出。但至少你不需要擔心dup ID。

+0

更新級聯將有助於解決我們的問題。這是不夠的(正如你指出的那樣),但有幫助。 ID溢出不應該是一個問題,因爲我們的ID都是bigint。 – aikimcr

2

這就是我要查看ETL工具(如CloverETL,Pentaho Kettle或Talend Studio)的情況。

我傾向於同意丹尼斯的觀點,即沒有任何真正的捷徑可以避免處理數據合併的複雜性。

相關問題