PostgreSQL 9.1 pg_restore error regarding PLPGSQL
我正在使用Postgres进行django项目,我目前正在实现一个数据库备份/恢复系统,当用户单击备份时,尽可能简单地执行pg_dump,然后在单击恢复备份时执行pg_restore。
所有看起来都很好和花花公子,直到它实际上尝试执行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自动创建的,因此注释行无法删除,并且没有标记可以禁用注释(我知道这一点),所以我真的不知道如何解决这个问题。
似乎pg_restore试图恢复一些你不拥有的额外数据。尝试将
1 | pg_restore -U username -c -n public -d database_name |
我在此页面上找到了以下解决方法:
http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php
我们的想法是使用pg_restore -l列出存档的内容,grep out用户无权恢复的扩展名,并在恢复时使用pg_restore -L来使用此省略列表。
例如:
1 2 | pg_restore -l ~/DATABASE.dump | grep -v"EXTENSION - plpgsql"> ~/restore_elements pg_restore -L ~/restore_elements ~/DATABASE.dump |
如果可能,我建议您在创建任何转储之前删除无法恢复的注释。
你可以这样做:
1 | COMMENT ON EXTENSION plpgsql IS NULL; |
如果您不想为每个新创建的数据库执行此操作,请从名为template1的数据库中删除注释(
之后创建的转储应该恢复,没有错误。
在这个命令之后为我工作 -
1 2 3 4 5 6 7 | 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 |
您是否加载到由其他用户创建的数据库中?如果可能,请尝试使用创建数据库及其现有对象的同一用户进行还原。