2014-10-07 91 views
4

我們有一臺運行在生產環境中的PostgreSQL服務器,以及大量帶有獨立開發環境的工作站。每個人都有自己的本地PostgreSQL服務器(沒有生產服務器的複製)。開發人員需要定期接收生產服務器中存儲的更新。PostgreSQL:使用遠程服務器上同一表中的新記錄更新表

我想弄清楚如何從服務器轉儲幾個選定表的內容,以便更新開發工作站上的表。最大的挑戰是我試圖同步的表可能是(開發人員可能通過Django ORM添加 - 但不刪除 - 表的新字段,而生產數據庫的模式長時間保持不變) 。

enter image description here

因此更新的記錄並存儲在工作站必須保留對覆蓋表的新領域。

我想直接轉儲(例如pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db)在這裏不適合。

UPD:如果可能的話,我也想避免使用第三(中級)數據庫,同時將生產數據庫中的數據傳輸到工作站。

+0

您可能會爲此編寫自己的基於觸發器的複製解決方案,或者大量修改Londiste之類的解決方案。 – 2014-10-08 01:35:18

回答

2

我會推薦以下方法。

我將基於單個表格customer概述示例。

  1. 我們希望從生產中複製此表中的一些條目。很明顯,全錶轉儲將打破在開發環境中存在的新東西;

  2. 因此,創建一個具有類似結構但名稱不同的表,如customer_$。另一種方法是爲這種「複製」表創建專用模式。您可能還想在其中包含幾個額外的列,如copy_id和/或copy_stamp;

  3. 現在您可以INSERT INTO customer_$ SELECT ...來填充您的複製表與所需的數據。不過,您可能需要考慮如何做到這一點。在我們使用的工具中,我們可以通過-w開關提供謂詞數據,如-w "customer_id IN (SELECT id FROM cust2copy)";

  4. 填充完複製表後,可以轉儲它們。確保使用以下開關的pg_dump

    • --column-inserts明確列出目標列,對發展ENV複製表可能已經改變了它的結構。儘管這對於大宗商品來說可能是「緩慢」的;
    • --table/-t指定要轉儲的表。
  5. 在目標env上,確保(1)清空複製表和(2)防止類似性質的並行活動;

  6. 將數據載入複製表;

  7. 最有意思的部分是:您需要檢查,您所關注的數據到INSERT不會與表中定義的任何約束衝突。您可能有:

    • PRIMARY KEY違規。您可以(1)替換現有條目或(2)合併條目或(3)跳過複製表中的條目或(4)選擇在複製表中分配不同的ID;
    • UNIQUE KEY違規行爲,很可能你必須UPDATE複製表中的某些列;
    • FOREIGN KEY違規行爲,您將不得不放棄此類條目,或複製生產中的缺失內容;
    • CHECK違規,您必須手動調查此問題。
  8. 檢查完成並且複製表中的數據已修復後,可以將其複製到主表中。

這是對方法的非常正式的描述。例如,對於步驟#7,我們有大量的額外工具可用於執行ID或ID範圍重新映射,操縱複製表中的數據,調整安全設置,所有權,某些默認值等。

另外,我們有一個這個工具叫做目錄,它允許我們將通用名稱下的邏輯關聯表分組。說,要從生產中複製客戶,我們必須檢查50個表格以滿足所有可能的依賴關係。

雖然到目前爲止我還沒有在野外看到類似的工具。

相關問題