2012-04-16 57 views
42

我使用的Postgres的Django项目,我目前正在执行一个数据库备份的PostgreSQL 9.1 pg_restore的错误/恢复系统,当用户单击备份,然后pg_restore的,当他们键还原备份尽可能简单执行pg_dump的。关于PLPGSQL

一切似乎很好,很正常,直到它实际上是尝试执行此时它给这个错误的pg_restore的:

pg_restore: [archiver (db)] Error from TOC entry 3206; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

我看着就是PLPGSQL等我明白了,对于错误我尝试手动设置“扩展的所有者”给执行脚本的用户,并拥有数据库本身,但没有任何改变,它真的很烦人,因为它试图设置所有东西的评论错误

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

+0

如果您连接使用PSQL和类型'\ l',你怎么看在该数据库中的“所有者”列?由于plpgsql是不可信的语言,它只能被数据库所有者或数据库超级用户修改(并且我猜这甚至适用于它的评论)。 – kgrittn 2012-04-16 09:22:16

+0

我可以证实,所有者是数据库的是正确的,由pg_restor命令的-U选项(和pg_dump的太)指定的用户 – 2012-04-16 23:28:55

+0

这不是那么简单,很遗憾匹配。我有pg_dump输出,希望能够使用这些语言创建语言和函数。如果我手动创建语言作为数据库超级用户,则由于权限错误而导致功能创建失败。如果我不这样做,程序语言安装由于许可错误而失败。在任何一种情况下,都会触发更多的依赖于现有功能的功能,因为这些功能不存在也无法创建。 – Quixadhal 2012-12-03 14:31:45

回答

75

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

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

这个选项是否涉及恢复后的信息丢失?也就是说,它会丢失任何重要的数据吗? – C2H5OH 2014-06-23 16:42:24

+7

@C2H5OH它取决于。当您的数据库备份包含多个模式时,上述命令只会导入模式“公共”(=信息丢失)。如果转储只包含schema“public”,那么你没有问题(参考:pg_dump --exclude-schema)。 要检查转储文件中的模式运行此:pg_restore -l -F t dumpfile.tar | grep SCHEMA | awk -F“”'{print $(NF-1)}' - – DanielaWaranie 2014-11-12 11:09:09

+1

这解决了我的问题,使用'pg_restore'尝试加载额外的扩展,在我们的场景中这是不允许的。 – nibbex 2015-03-12 13:32:27

1

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

+0

没有一切都与“-U用户名”标志作为同一个用户来调用 – 2012-04-16 06:01:48

12

,我发现这个页面上的以下解决方法:

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 
+1

这对我有效。尽管如此,第二个命令会将所有内容打印到“STDOUT”中,因此您可能希望将其重定向到文件。 – shrx 2014-10-25 09:31:29

1

工作对我来说这个命令后 -

[email protected]:~$ sudo -i -u postgres 
[email protected]:~$ psql 
psql (9.3.5) 
Type "help" for help. 

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user; 
postgres=# GRANT 
2

如果可能的话,我建议你删除它未能创造任何转储之前恢复评论。

你可以这样做:

COMMENT ON EXTENSION plpgsql IS null; 

如果你不想为每个新创建的数据库做到这一点,请从DB叫template1的注释(CREATE DATABASE…复制该数据库。)

之后创建的转储应该无错地恢复。