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的转储应该没有错误地恢复。