1

创建数据库后,我通过脚本使用.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,否则整个过程将无法完成.

知道怎么做吗?

4

2 回答 2

3

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

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

于 2017-05-11T05:51:17.347 回答
0

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

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

于 2017-05-10T17:13:57.397 回答