有关PLPGSQL的PostgreSQL 9.1 pg_restore错误

时间:2012-04-16 05:44:11

标签: postgresql plpgsql database-restore

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

所有看起来都很精致和花花公子,直到它实际上尝试执行pg_restore,此时它会出现此错误:

  

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

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

这都是由pg_dump自动创建的,因此注释行无法删除,并且没有标记可以禁用注释(我知道这一点),所以我真的不知道如何解决这个问题。

6 个答案:

答案 0 :(得分:107)

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

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

答案 1 :(得分:14)

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

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

这个想法是使用pg_restore -l列出存档的内容,grep out用户没有恢复权限的扩展名,并在恢复时使用pg_restore -L来使用这个省略的列表。

例如:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump

答案 2 :(得分:4)

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

您可以通过以下方式实现:

COMMENT ON EXTENSION plpgsql IS null;

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

之后创建的转储应该在没有错误的情况下恢复。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

在此命令后为我工作 -

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

答案 5 :(得分:2)

如果您正在运行Postgres 11's (or higher) version of pg_dump,则可以利用新的mod_rewrite标志。