2011-03-19 137 views
6

我有一個大約85 +表postgresql數據庫。我經常在複製模式下使用pg_dump(通過php-pgadmin)進行備份,備份文件的大小几乎爲10-12 MB。現在我面臨的問題是每當我嘗試恢復數據庫時,都會出現外鍵約束問題。場景如下:從備份恢復PostgreSQL數據庫沒有外鍵約束問題

有兩個表格:1)users和2)zones。我在users表中存儲了區域的標識以標識用戶的區域並將其設置爲外鍵。

當我拿到數據庫轉儲時,表zones的條目只來自表users的條目。我認爲這是由於表名的第一個字母:uz之前,因此當我恢復數據庫時,會發生外鍵約束問題,並停止執行。當我嘗試恢復數據庫結構時,會發生同樣的問題,它說數據庫中不存在表zones,因爲zones的結構在轉儲文件中的結構爲users之後。

有沒有解決方案?有沒有其他備份方法可行?使用

+0

其實我通過phppgadmin接口發送我從phppgadmin作爲sql獲得的轉儲..... – 2011-03-19 18:49:22

回答

6

聽起來就像你得到一個SQL轉儲,而不是從pg_dump二進制轉儲。這將爲您提供一大堆SQL,其中包含頂部的模式(包括FK),然後是一堆INSERT以重新加載數據。來自pg_dump的二進制轉儲會爲您提供更好的服務,看起來您需要一些額外的配置來告訴PhpPgAdmin,其中pg_dump是。然後,將該二進制轉儲饋送到pg_restorepg_restore將按正確順序重建所有內容以避免參照完整性問題(或者,更確切地說,pg_restore將恢復所有數據,然後添加約束)。

PhpPgAdmin seems to want to work with plain SQL dumps而不是pg_restore。我發現這很難相信,但是在有關調用pg_restore的文檔中找不到任何內容。如果這是真的,那麼您可能需要手動編輯SQL轉儲並將所有FK移到最後。

您也可以嘗試在SQL轉儲的頂部添加SET CONSTRAINTS ALL DEFERRED;,這應該延遲約束檢查直到事務結束,您還需要確保整個INSERT塊包含在事務中。

如果phpPgAdmin的真的不能調用pg_restore那麼你最好使用pg_dumppg_restore手,讓你有在你的備份過程必要的控制使用了。很抱歉,任何無法處理用FK備份數據庫的數據庫管理工具都比無用的更糟糕。希望有人知道他們的方式PhpPgAdmin將出現,並讓我們知道如何使用pg_restore與PhpPgAdmin。

+0

是pg_restore是我想要的..現在數據遷移運行良好,但現在是一個新問題....當我導入數據庫結構,並將用戶pg_restore恢復到一個新的數據庫,像「序列X已經存在的錯誤「出現了..我發現問題是自動增量字段的數據類型是在數據庫轉儲bigserial,所以postgres自動創建一個基於列名稱的序列..但低於create table語句轉儲有一個創建序列聲明創建一個與postgres自動生成的序列同名的序列,這會引發錯誤。任何解決方案? – 2011-03-23 03:56:31

+1

@Midhun:你應該恢復到一個空的數據庫,然後'pg_restore'將設置所有的東西。或者,如果您的架構已經存在,但沒有數據,則可以通過「pg_restore」來恢復數據。聽起來像模式已經存在,你的恢復也試圖恢復模式。 – 2011-03-23 04:22:39

1

pgdump(通過PHP-的pgAdmin)

確定phpPgAdmin的是使用的pg_dump創建備份?我從來沒有見過任何由pg_dump創建的轉儲,在恢復轉儲時遇到外鍵問題。

PhpPgAdmin只是一個PHP腳本,在大多數情況下,它不具有像pg_dump那樣啓動程序的權限。

+0

我相信PhpPgAdmin使用pgdump進行備份......我錯了嗎? [鏈接] http://en.wikipedia.org/wiki/PhpPgAdmin [link]說它可以使用pg_dump ..但我不知道當轉儲完成時接口是否使用pg_dump ...有人可以確認嗎? – 2011-03-19 18:53:30

0

我會先刪除fk創建並將其添加到腳本的末尾。

3

如果它對任何人都有幫助:以前的解決方案都不適用於我(有些INSERT引用了稍後轉儲的引用數據,如果它是二進制格式或純SQL查詢,則爲獨立數據)。

我做了什麼:我使用了schemaspy,這個腳本與其他功能一樣,比如一個真正有用的基礎ER模型的html圖表 - 它生成了兩個非常有用的列表:「插入順序」(其中所有的爲了執行插入,考慮現有的限制和依賴性,表格被列爲最佳順序)和「刪除順序」(對DROP表格非常有用)。

如果您需要樣品,請檢查此http://schemaspy.sourceforge.net/sample/。特別是,我剛纔提到了兩個樣本列表(試圖發佈直接鏈接,但垃圾郵件防範機制允許我發佈2個鏈接)。

+0

這些是樣本列表! http://schemaspy.sourceforge.net/sample/insertionOrder.txt http://schemaspy.sourceforge.net/sample/deletionOrder.txt – jquinter 2012-07-13 03:03:21