PostgreSQL 9.1关于PLPGSQL的pg_restore错误

我正在使用Postgres做一个django项目,目前我正在实现一个尽可能简单的数据库备份/恢复系统,当用户单击备份时执行pg_dump,然后在单击还原备份时执行pg_restore。

所有似乎都很好,直到它实际上试图执行pg_restore,在这个时候它给这个错误:

pg_restore:[archiver(db)]来自TOC项目3206的错误; 0 0 COMMENT EXTENSION plpgsql pg_restore:[archiver(db)]无法执行查询:ERROR:必须是扩展plpgsql的所有者命令是:COMMENT ON EXTENSION plpgsql是'PL / pgSQL过程语言';

我已经研究了什么plpgsql是等,我明白了,关于错误,我试图手动设置“扩展的所有者”执行脚本的用户,拥有数据库本身,但没有改变,它真的很烦人,因为它试图对所有事情发表评论的错误

这一切都是由pg_dump自动创build的,所以注释行不能被删除,也没有标志来禁用注释(我知道closures),所以我真的坚持如何解决这个问题。

似乎pg_restore试图恢复一些你不拥有的额外数据。 尝试将-n public选项添加到您的pg_restore命令行。 它会告诉pg_restore只恢复公共模式的内容。 你的命令行应该看起来像

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

我在此页面上find了以下解决方法:

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 

你是否正在加载由不同用户创build的数据库? 如果可能,请尝试使用创build数据库及其现有对象的相同用户进行恢复。

在这个命令之后为我工作 –

 Deepak@deepak:~$ sudo -i -u postgres postgres@deepak:~$ psql psql (9.3.5) Type "help" for help. postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user; postgres=# GRANT 

如果可能,我build议您在创build任何转储之前删除无法恢复的评论。

你可以这样做:

 COMMENT ON EXTENSION plpgsql IS null; 

如果您不想为每个新创build的数据库执行此操作,请从名为template1的数据库中删除注释( CREATE DATABASE…复制此数据库。)

在那之后创build的转储应该没有错误地恢复。