关于PLPGSQL的PostgreSQL 9.1 pg_restore错误

xpcnnkqh  于 2023-01-12  发布在  PostgreSQL
关注(0)|答案(7)|浏览(323)

我正在为一个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自动创建的,所以注解行不能被删除,也没有禁用注解的标志(我知道关闭了),所以我真的很想知道如何解决这个问题。

j91ykkif

j91ykkif1#

pg_restore似乎试图恢复一些您不拥有的额外数据。尝试在pg_restore命令行中添加-n public选项。它将告诉pg_restore仅恢复公共架构的内容。您的命令行应如下所示

pg_restore -U username -c -n public -d database_name
guykilcj

guykilcj2#

我在此页面上找到了以下解决方法:
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
chhqkbe1

chhqkbe13#

如果您运行的是Postgres 11's (or higher) version of pg_dump,那么您可以利用新的--no-comments标志。

z9gpfhce

z9gpfhce4#

如果可能,我建议您在创建任何转储之前删除无法恢复的注解。
您可以通过以下方式实现此目的:

COMMENT ON EXTENSION plpgsql IS null;

如果您不想对每个新创建的数据库都执行此操作,请从名为template1的DB中删除注解(CREATE DATABASE…复制此数据库)。
在此之后创建的转储应该可以恢复而不会出现错误。

prdp8dxp

prdp8dxp5#

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

zzlelutf

zzlelutf6#

在这个命令之后对我有效-

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
r6vfmomb

r6vfmomb7#

我发现给数据库用户正确的权限对我来说是有效的。我也遇到了同样的错误,这是因为我使用的postgres用户不是超级用户。现在我知道给超级用户权限有很多警告,但如果这是集群上唯一的数据库,这应该不是问题。
您可以通过使用sudo -u postgres psql登录到postgres shell来完成此操作
然后使用ALTER USER your_db_username WITH SUPERUSER设置权限
然后重启服务X1 M2 N1 X。
现在再次运行restore/backup命令,它应该可以工作。另一个注意事项是,我相信使用这些新权限进行备份和恢复是很重要的。

相关问题