2017-05-10 43 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语句)

相关问题