79

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

一切看起来都很好,直到它实际尝试执行 pg_restore 时它给出了这个错误:

pg_restore: [archiver (db)] 来自 TOC 条目 3206 的错误;0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] 无法执行查询: 错误: must be owner of extension plpgsql 命令是: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

我已经研究了 plpgsql 是什么等,我明白了,关于错误,我尝试手动将“扩展的所有者”设置为执行脚本并拥有数据库本身的用户,但没有任何改变,这真的很烦人尝试设置所有事物的评论时出错

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

4

6 回答 6

132

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

pg_restore -U username -c -n public -d database_name
于 2012-08-02T11:00:00.970 回答
18

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

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
于 2012-09-04T17:04:24.230 回答
9

If you're running Postgres 11's (or higher) version of pg_dump then you can take advantage of the new --no-comments flag.

于 2019-10-17T12:00:00.967 回答
7
于 2017-03-11T17:12:11.583 回答
3

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

于 2012-04-16T05:47:20.640 回答
3

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

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
于 2015-04-10T11:25:59.223 回答