如何解决Postgresql 8.4错误'语言'plpgsql“已经存在”?

时间:2017-05-10 16:22:34

标签: postgresql database-restore postgresql-8.4 pg-restore

创建数据库后,我通过脚本使用 .backup 文件(正确的错误处理)在此空白/新数据库上恢复PostgreSQL 8.4中的数据库。如果发生任何错误,则脚本将中止整个过程并将该过程标记为失败。在数据库恢复期间,会生成以下错误:

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,否则,整个过程将赢得'完成。

知道怎么做吗?

2 个答案:

答案 0 :(得分:2)

在这个问题上工作了几个小时后,我发现以下解决方案基本而简单。使用命令' CREATE DATABASE'创建的数据库。使用名为' template1'的标准系统数据库。默认情况下。相反,请使用' template0'。如document中所述:

  

通过指示CREATE DATABASE复制template0而不是template1,您可以创建一个" virgin"用户数据库,其中不包含template1中的任何站点本地添加项。这在恢复pg_dump转储时特别方便:转储脚本应该在原始数据库中恢复,以确保重新创建转储数据库的正确内容,而不会与稍后可能已添加到template1的对象发生冲突。

答案 1 :(得分:0)

我怀疑有一个优雅的解决方法。每个人都说应该忽略这个信息。

一个肮脏的解决方法:在DROP LANGUAGE ..之前插入pg_restore,之后插入CREATE OR REPLACE LANGUAGE(后者,以防万一转储不包含CREATE语句)