我使用命令
为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
我深入研究了纯文本SQL pg_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
。
我该如何解决这个问题?
答案 0 :(得分:61)
要解决此问题,您必须分配正确的所有权。请尝试以下解决方案,以解决特定用户的所有权限相关问题,但正如评论中所述,这不应在生产中使用:
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=#
因此,在超级用户帐户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。
答案 1 :(得分:45)
AWS RDS用户如果您收到此消息是因为您不是超级用户,并且根据aws文档,您不能成为其中一员。我发现我必须忽略这些错误。
答案 2 :(得分:17)
对于使用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 docs中提供的命令修改的权限问题,此当前主题提示或Google Postgres团队here的建议。建议发出以下命令:
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
答案 3 :(得分:12)
在这种情况下,您可以安全地忽略错误消息。未能向公共模式添加注释并安装plpgsql(应该已经安装)不会导致任何实际问题。
但是,如果要完全重新安装,则需要具有适当权限的用户。当然,这不应该是您的应用程序常规运行的用户。
答案 4 :(得分:12)
更短的答案:忽略它。
此模块是处理SQL语言的Postgres的一部分。该错误通常会作为复制远程数据库的一部分弹出,例如 a&#39; heroku pg:pull&#39;。它不会覆盖您的SQL处理器并向您发出警告。
答案 5 :(得分:3)
使用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
答案 6 :(得分:3)
对于使用 AWS 的用户,COMMENT ON EXTENSION
仅可以作为超级用户来使用,并且据我们所知,文档是RDS实例由Amazon管理。因此,为防止破坏复制等操作,您的用户-甚至您在创建实例时设置的root用户-都将不具有完整的超级用户特权:
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
创建数据库实例时,您所使用的主用户系统帐户 将create分配给rds_superuser角色。 rds_superuser角色 是类似于PostgreSQL超级用户的预定义Amazon RDS角色 角色(在本地实例中通常命名为postgres),但有一些 限制。与PostgreSQL超级用户角色一样,rds_superuser 角色在您的数据库实例上拥有最多特权,因此您不应 将此角色分配给用户,除非他们需要对数据库的最大访问权限 实例。
为了解决此错误,只需使用--
注释掉包含COMMENT ON EXTENSION
的SQL行
答案 7 :(得分:2)
对我来说,我正在使用 pgAdmin 设置数据库,似乎在数据库创建期间设置所有者是不够的。我不得不向下导航到'public'架构并在那里设置所有者(最初是'postgres')。
答案 8 :(得分:2)
通过指定从-L
提取的文件,尝试在pg_restore中使用pg_dump -Fc
标志
-L列表文件 --use-list =列表文件
仅还原列表文件中列出的那些归档元素,并按照它们在文件中出现的顺序还原它们。请注意,如果将-n或-t之类的过滤开关与-L一起使用,它们将进一步限制恢复的项目。
列表文件通常是通过编辑先前的-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
--
答案 9 :(得分:0)
对于将问题缩小到COMMENT ON
语句(按照下面的各种答案)并且对创建转储文件的源数据库具有超级用户访问权限的人,最简单的解决方案是防止首先,通过将注释从正在转储的源数据库中删除,将注释包括到转储文件中。
COMMENT ON EXTENSION postgis IS NULL;
COMMENT ON EXTENSION plpgsql IS NULL;
COMMENT ON SCHEMA public IS NULL;
将来的转储将不包含COMMENT ON
语句。
答案 10 :(得分: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
一些注意事项