2017-05-10 44 views
0

創建數據庫後,我通過腳本(通過正確的錯誤處理)使用備份文件在黑色數據庫上恢復postgresql 8.4上的數據庫。如果發生任何錯誤,腳本將中止整個過程並將過程標記爲失敗。在數據庫恢復以下生成錯誤:如何解決Postgresql 8.4錯誤「語言」plpgsql「已經存在」?

pg_restore: connecting to database for restore 
pg_restore: creating SCHEMA public 
pg_restore: creating COMMENT SCHEMA public 
pg_restore: creating PROCEDURAL LANGUAGE plpgsql 
pg_restore: [archiver (db)] Error while PROCESSING TOC: 
pg_restore: [archiver (db)] Error from TOC entry 302; 2612 16386 PROCEDURAL LANGUAGE plpgsql postgres 
pg_restore: [archiver (db)] could not execute query: ERROR: language "plpgsql" already exists 
    Command was: 
CREATE PROCEDURAL LANGUAGE plpgsql; 
pg_restore: setting owner and privileges for SCHEMA public 
pg_restore: setting owner and privileges for COMMENT SCHEMA public 
pg_restore: setting owner and privileges for ACL public 
pg_restore: setting owner and privileges for PROCEDURAL LANGUAGE plpgsql 
WARNING: errors ignored on restore: 1 
Exit code : 1 

我知道,這個錯誤應該在PostgreSQL的8.x中被忽略,但因爲我是通過腳本執行此,需要此需要解決的問題,即PostgreSQL的退出代碼應該是0,否則整個過程將不會完成。

任何想法如何做到這一點?

+0

我們實際上正在進行升級,只是在升級失敗的情況下才需要升級。 –

回答

1

在這個問題上工作了幾個小時後,我發現以下解決方案基本和簡單。使用命令「CREATE DATABASE」創建的數據庫默認使用名爲'template1'的標準系統數據庫。相反,使用'template0'。正如document說:

通過指示CREATE DATABASE複製,而不是模板1 template0中,你可以創建一個包含任何template1裏的本地站點添加的「處女」的用戶數據庫。恢復pg_dump轉儲時特別方便:應該在原始數據庫中恢復轉儲腳本以確保重新創建轉儲數據庫的正確內容,而不會與稍後可能添加到template1的對象發生任何衝突。

0

我懷疑有一個優雅的解決方法。大家都說這個信息應該被忽略。

一個骯髒的解決方法:將pg_restoreCREATE OR REPLACE LANGUAGE事後之前DROP LANGUAGE ..(後者,公正的情況下轉儲沒有包含CREATE語句)

相關問題