2012-04-16 27 views
42

我使用的Postgres的Django項目,我目前正在執行一個數據庫備份的PostgreSQL 9.1 pg_restore的錯誤/恢復系統,當用戶單擊備份,然後pg_restore的,當他們鍵還原備份儘可能簡單執行pg_dump的。關於PLPGSQL

一切似乎很好,很正常,直到它實際上是嘗試執行此時它給這個錯誤的pg_restore的:

pg_restore: [archiver (db)] Error from TOC entry 3206; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

我看着就是PLPGSQL等我明白了,對於錯誤我嘗試手動設置「擴展的所有者」給執行腳本的用戶,並擁有數據庫本身,但沒有任何改變,它真的很煩人,因爲它試圖設置所有東西的評論錯誤

這是所有這些都是由pg_dump自動創建的,所以註釋行不能被刪除,並且沒有標誌來禁用註釋(我知道),所以我真的堅持如何解決這個問題。

+0

如果您連接使用PSQL和類型'\ l',你怎麼看在該數據庫中的「所有者」列?由於plpgsql是不可信的語言,它只能被數據庫所有者或數據庫超級用戶修改(並且我猜這甚至適用於它的評論)。 – kgrittn 2012-04-16 09:22:16

+0

我可以證實,所有者是數據庫的是正確的,由pg_restor命令的-U選項(和pg_dump的太)指定的用戶 – 2012-04-16 23:28:55

+0

這不是那麼簡單,很遺憾匹配。我有pg_dump輸出,希望能夠使用這些語言創建語言和函數。如果我手動創建語言作爲數據庫超級用戶,則由於權限錯誤而導致功能創建失敗。如果我不這樣做,程序語言安裝由於許可錯誤而失敗。在任何一種情況下,都會觸發更多的依賴於現有功能的功能,因爲這些功能不存在也無法創建。 – Quixadhal 2012-12-03 14:31:45

回答

75

看起來pg_restore試圖恢復一些你不擁有的額外數據。嘗試將-n public選項添加到您的pg_restore命令行。它會告訴pg_restore只恢復公共模式的內容。你的命令行應該看起來像

pg_restore -U username -c -n public -d database_name 
+6

這個選項是否涉及恢復後的信息丟失?也就是說,它會丟失任何重要的數據嗎? – C2H5OH 2014-06-23 16:42:24

+7

@C2H5OH它取決於。當您的數據庫備份包含多個模式時,上述命令只會導入模式「公共」(=信息丟失)。如果轉儲只包含schema「public」,那麼你沒有問題(參考:pg_dump --exclude-schema)。 要檢查轉儲文件中的模式運行此:pg_restore -l -F t dumpfile.tar | grep SCHEMA | awk -F「」'{print $(NF-1)}' - – DanielaWaranie 2014-11-12 11:09:09

+1

這解決了我的問題,使用'pg_restore'嘗試加載額外的擴展,在我們的場景中這是不允許的。 – nibbex 2015-03-12 13:32:27

1

您是否正在加載由其他用戶創建的數據庫?如果可能,請嘗試使用創建數據庫及其現有對象的相同用戶進行恢復。

+0

沒有一切都與「-U用戶名」標誌作爲同一個用戶來調用 – 2012-04-16 06:01:48

12

,我發現這個頁面上的以下解決方法:

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

的想法是使用pg_restore的-l列出歸檔的內容,用grep出用戶沒有恢復權限的擴展名,並且在恢復時使用pg_restore -L來使用這個被刪除的列表。

例如:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements 
pg_restore -L ~/restore_elements ~/database.dump 
+1

這對我有效。儘管如此,第二個命令會將所有內容打印到「STDOUT」中,因此您可能希望將其重定向到文件。 – shrx 2014-10-25 09:31:29

1

工作對我來說這個命令後 -

[email protected]:~$ sudo -i -u postgres 
[email protected]:~$ psql 
psql (9.3.5) 
Type "help" for help. 

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user; 
postgres=# GRANT 
2

如果可能的話,我建議你刪除它未能創造任何轉儲之前恢復評論。

你可以這樣做:

COMMENT ON EXTENSION plpgsql IS null; 

如果你不想爲每個新創建的數據庫做到這一點,請從DB叫template1的註釋(CREATE DATABASE…複製該數據庫。)

之後創建的轉儲應該無錯地恢復。