我正在为一个django项目使用Postgres,目前我正在实现一个数据库备份/恢复系统,当用户点击备份时,该系统尽可能简单地执行pg_dump,然后当用户点击恢复备份时,执行pg_restore。
一切看起来都很好,直到它实际上尝试执行pg_restore时,它给出了这个错误:
pg_restore:[存档程序(db)] TOC条目3206中的错误;0 0注解扩展名plpgsql pg_restore:[归档程序(db)]无法执行查询:错误:必须是扩展plpgsql的所有者命令是:对plpgsql扩展为“PL/pgSQL过程语言”的评述
我已经研究了plpgsql等,我理解了这一点,关于这个错误,我尝试手动将“扩展的所有者”设置为执行脚本并拥有数据库本身的用户,但没有任何变化,这真的很烦人,因为它在尝试设置所有内容的注解时出错
这都是由pg_dump自动创建的,所以注解行不能被删除,也没有禁用注解的标志(我知道关闭了),所以我真的很想知道如何解决这个问题。
7条答案
按热度按时间j91ykkif1#
pg_restore似乎试图恢复一些您不拥有的额外数据。尝试在pg_restore命令行中添加
-n public
选项。它将告诉pg_restore仅恢复公共架构的内容。您的命令行应如下所示guykilcj2#
我在此页面上找到了以下解决方法:
http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php
其思想是使用pg_restore -l列出存档的内容,grep出用户没有恢复权限的扩展名,并使用pg_restore -L在恢复时使用这个取消的列表。
例如:
chhqkbe13#
如果您运行的是Postgres 11's (or higher) version of
pg_dump
,那么您可以利用新的--no-comments
标志。z9gpfhce4#
如果可能,我建议您在创建任何转储之前删除无法恢复的注解。
您可以通过以下方式实现此目的:
如果您不想对每个新创建的数据库都执行此操作,请从名为template1的DB中删除注解(
CREATE DATABASE…
复制此数据库)。在此之后创建的转储应该可以恢复而不会出现错误。
prdp8dxp5#
是否正在加载到由其他用户创建的数据库?如果可能,请尝试使用创建数据库及其现有对象的同一用户进行还原。
zzlelutf6#
在这个命令之后对我有效-
r6vfmomb7#
我发现给数据库用户正确的权限对我来说是有效的。我也遇到了同样的错误,这是因为我使用的postgres用户不是超级用户。现在我知道给超级用户权限有很多警告,但如果这是集群上唯一的数据库,这应该不是问题。
您可以通过使用
sudo -u postgres psql
登录到postgres shell来完成此操作然后使用
ALTER USER your_db_username WITH SUPERUSER
设置权限然后重启服务X1 M2 N1 X。
现在再次运行restore/backup命令,它应该可以工作。另一个注意事项是,我相信使用这些新权限进行备份和恢复是很重要的。