2014-10-22 65 views
1

我有一個PostgreSQL的轉儲問題新的主鍵值/恢復。我們有一個運行PostgresSQL 8.4的生產應用程序。我需要在測試環境中的數據庫中創建一些值,然後將這部分數據導入生產環境。數據是由應用程序生成的,我需要使用這種方法,因爲它在進入生產之前需要進行測試。現在恢復PostgreSQL的轉儲

,我描述的環境,這裏是我的問題:

測試數據庫中,我離開只是我需要移動到生產數據庫中的數據。數據分佈在多個與多級外鍵鏈接的表上(如樹)。然後我使用pg_dump將所需的表格導出爲二進制格式。

當我嘗試導入,數據庫將正確導入新的主鍵值根表項,但不從其他表導入任何數據。我相信問題是子表上的外鍵不再識別新的主鍵。

是否有辦法實現這樣的導入,它將更新樹中所有受影響表的所有主鍵值,以自動更正串行(自動增量)值,並根據這些新的主鍵值更新所有外鍵?

我並知道如何使用的編程語言,同時連接到這兩個數據庫的幫助做到這一點,但因爲我沒有爲客戶的生產服務器的直接訪問,這將是一個很大的問題實現了我。

在此先感謝!

回答

2

那一個在我看來,像一個複雜的遷移問題。您可以使用插入創建PL/pgSQL遷移腳本,並使用返回來獲取連續並用作樹中其他表的外鍵。我不知道樹的結構,但在某些情況下,由於複雜性或性能原因,可能需要將序列值事先讀入數組。

其他的方法可以是檢查生產序列值和不會在不久的將來被用來估計序列值。在測試環境中製作測試數據,以獲得不會與生產順序值相沖突的串行值。然後將該數據加載到prod數據庫並調整prod環境的序列值,以便不使用測試序列值。它會在你的ID序列中留下一個空白,所以你必須檢查是否有任何東西(如其他進程)依賴序列值來連續。

+0

感謝您的快速回答!差距可能是一個問題,因爲客戶在發票,優惠等中使用各種記錄的ID。但是我會研究PL/pgSQL語言。我對它並不是很有經驗,但我明白我能用它做什麼。 – j0hny 2014-10-22 10:05:22

+0

您的測試數據將佔用序列值,因此無論如何都要準備好有差距。當然,您可以刪除測試數據並修改序列,但如果用戶在測試的時間範圍內使用生產環境,則無法執行此操作,因爲數據庫會變得混亂。 數據庫工具可以將數據導出爲插入語句,這可以作爲導出數據的起點。你可以使用INSERT INTO table(cols)VALUES(vals)RETURNING idcolumn來獲取ID的值。您也可以使用帶有子選擇的INSERT。 INSERT WITH也是一個方便的工具。 祝你好運:) – Peter 2014-10-22 10:17:47

+0

感謝您的建議彼得。實際上,我想出了另一種可能性 - 它可以創造很小的差距,但是我有更多的控制權 - 我創建了一個腳本,用於在所有受影響的表中增加生產環境中的序列數,並增加我想要插入的行數+保留。然後,我生成的數據插入與開始序列在生產開始「差距」,然後只需插入:-)。 該解決方案的工作原理和創建的差距很小。自從這個想法出來後,我接受了你的答案。謝謝。 – j0hny 2014-10-23 10:16:55