123

我已经使用以下命令为 Postgres 数据库转储了一个干净的、没有所有者的备份

pg_dump sample_database -O -c -U

后来,当我用

psql -d sample_database -U app_name

但是,我遇到了几个错误,这些错误使我无法恢复数据:

ERROR:  must be owner of extension plpgsql
ERROR:  must be owner of schema public
ERROR:  schema "public" already exists
ERROR:  must be owner of schema public
CREATE EXTENSION
ERROR:  must be owner of extension plpgsql

我深入研究了纯文本 SQLpg_dump生成,发现它包含 SQL

CREATE SCHEMA public;
COMMENT ON SCHEMA public IS 'standard public schema';
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

我认为原因是用户app_name没有更改public架构和plpgsql.

我该如何解决这个问题?

4

11 回答 11

73

要解决此问题,您必须分配适当的所有权权限。尝试以下应该解决特定用户的所有权限相关问题,但如评论中所述,这不应该在生产中使用:

root@server:/var/log/postgresql# sudo -u postgres psql
psql (8.4.4)
Type "help" for help.

postgres=# \du
               List of roles
    Role name    | Attributes  | Member of
-----------------+-------------+-----------
 <user-name>    | Superuser   | {}
                 : Create DB
 postgres       | Superuser   | {}
                 : Create role
                 : Create DB

postgres=# alter role <user-name> superuser;
ALTER ROLE
postgres=#

所以连接到Superuser帐户下的数据库sudo -u postgres psql并执行一条ALTER ROLE <user-name> Superuser;语句。

请记住,这不是多站点托管服务器上的最佳解决方案,因此请查看分配单个角色:https ://www.postgresql.org/docs/current/static/sql-set-role.html和https ://www.postgresql.org/docs/current/static/sql-alterrole.html

于 2013-03-16T18:04:13.937 回答
67

AWS RDS 用户,如果您收到此信息,那是因为您不是超级用户,并且根据 aws 文档,您不能成为超级用户。我发现我必须忽略这些错误。

于 2017-02-24T14:21:46.993 回答
32

对于使用 Google Cloud Platform 的人,任何错误都会停止导入过程。根据我发出的 pg_dump 命令,我个人遇到了两个不同的错误:

1-The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.

当您尝试以非纯文本格式转储数据库时发生。即当命令缺少 -Fp 或 --format=plain 参数时。但是,如果将其添加到命令中,则可能会遇到以下错误:

2-SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql

这是一个权限问题,我无法使用GCP 文档中提供的命令、当前线程中的提示或此处的 Google Postgres 团队的建议来修复。其中建议发出以下命令:

pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql

在我的情况下,唯一能解决问题的是手动编辑转储文件并注释掉与 plpgsql 相关的所有命令。

我希望这对依赖 GCP 的人有所帮助。

更新 :

转储注释掉扩展名的文件更容易,特别是因为一些转储可能很大: pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql

可以缩小到 plpgsql : pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql

于 2017-10-11T13:20:07.450 回答
17

-L通过指定取自的文件,尝试将标志与 pg_restore 一起使用pg_dump -Fc

-L 列表文件 --use-list=列表文件

仅恢复列表文件中列出的归档元素,并按照它们在文件中出现的顺序恢复它们。请注意,如果 -n 或 -t 等过滤开关与 -L 一起使用,它们将进一步限制恢复的项目。

list-file 通常是通过编辑前一个 -l 操作的输出来创建的。可以移动或删除行,也可以通过在行首放置分号 (;) 将其注释掉。请参阅下面的示例。

https://www.postgresql.org/docs/9.5/app-pgrestore.html

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep -v 'COMMENT - EXTENSION' > pg_restore.list
pg_restore -L pg_restore.list pg.dump

在这里,您可以通过仅输出注释来看到Inverse为真:

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' > pg_restore_inverse.list
pg_restore -L pg_restore_inverse.list pg.dump
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.4.15
-- Dumped by pg_dump version 9.5.14

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- PostgreSQL database dump complete
--
于 2018-11-06T06:03:38.390 回答
14

在这种情况下,您可能可以放心地忽略错误消息。未能向公共架构添加注释并安装 plpgsql(应该已经安装)不会导致任何实际问题。

但是,如果您想完全重新安装,则需要具有适当权限的用户。当然,这不应该是您的应用程序经常运行的用户。

于 2012-11-16T09:31:30.873 回答
12

简短的回答:忽略它。

这个模块是 Postgres 处理 SQL 语言的一部分。该错误通常会在复制远程数据库时弹出,例如使用“heroku pg:pull”。它不会覆盖您的 SQL 处理器,并会就此向您发出警告。

于 2015-03-28T17:35:48.593 回答
8

对于使用AWS的人,COMMENT ON EXTENSION只能作为超级用户,并且正如我们从文档中知道的那样,RDS 实例由 Amazon 管理。因此,为了防止您破坏复制之类的事情,您的用户 - 甚至是您在创建实例时设置的 root 用户 - 都不会拥有完整的超级用户权限:

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html

创建数据库实例时,您创建的主用户系统账户将分配给 rds_superuser 角色。rds_superuser 角色是一个预定义的 Amazon RDS 角色,类似于 PostgreSQL 超级用户角色(在本地实例中通常命名为 postgres),但有一些限制。与 PostgreSQL 超级用户角色一样,rds_superuser 角色对您的数据库实例拥有最多的权限,您不应将此角色分配给用户,除非他们需要对数据库实例的最多访问权限。

为了修复这个错误,只需使用--注释掉包含的 SQL 行COMMENT ON EXTENSION

于 2020-02-20T00:13:24.753 回答
3

对于已将问题缩小到COMMENT ON语句(根据下面的各种答案)并且对创建转储文件的源数据库具有超级用户访问权限的人,最简单的解决方案可能是防止将注释包含到转储中首先文件,通过从被转储的源数据库中删除它们...

COMMENT ON EXTENSION postgis IS NULL;
COMMENT ON EXTENSION plpgsql IS NULL;
COMMENT ON SCHEMA public IS NULL;

未来的转储将不包括这些COMMENT ON语句。

于 2020-05-12T08:52:32.730 回答
2

使用 postgres (admin) 用户转储架构,重新创建它并授予使用权限,然后再进行还原。在一个命令中:

sudo -u postgres psql -c "DROP SCHEMA public CASCADE;
create SCHEMA public;
grant usage on schema public to public;
grant create on schema public to public;" myDBName
于 2015-10-18T14:31:59.713 回答
1

对我来说,我正在使用pgAdmin设置数据库,似乎在创建数据库期间设置所有者是不够的。我不得不向下导航到“公共”模式并将所有者也设置在那里(最初是“postgres”)。

于 2017-05-10T06:56:14.850 回答
0

一些答案已经提供了与摆脱创建扩展和评论扩展相关的各种方法。对我来说,以下命令行似乎有效,并且是解决问题的最简单方法:

cat /tmp/backup.sql.gz | gunzip - | \
  grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' |  \
    psql --set ON_ERROR_STOP=on -U db_user -h localhost my_db

一些笔记

  • 第一行只是解压缩我的备份,您可能需要进行相应调整。
  • 第二行是使用 grep 来删除有问题的行。
  • 第三行是我的 psql 命令;您可能需要像通常使用 psql 进行恢复一样进行调整。
于 2021-02-20T19:40:42.257 回答