恢复PostgreSQL数据库时如何解决权限问题

ste*_*ang 89 postgresql database-backups rails-postgresql

我使用该命令为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
Run Code Online (Sandbox Code Playgroud)

我深入研究了纯文本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';
Run Code Online (Sandbox Code Playgroud)

我认为原因是用户app_name没有权限来改变public架构plpgsql.

我怎么能解决这个问题?

Dan*_*ski 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=#
Run Code Online (Sandbox Code Playgroud)

因此,在超级用户帐户下连接到数据库sudo -u postgres psql并执行ALTER ROLE <user-name> Superuser;语句.

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

  • 有没有办法在没有超级用户的情况下做到这一点? (26认同)
  • "必须分配正确的所有权权限"和"alter role <用户名>超级用户"不一致.适当的所有权意味着`app_user`不是*超级用户. (17认同)
  • 制作普通用户"超级用户"是一个不好的建议 (6认同)
  • 恕我直言,这不是解决方案,但在生产中应该避免使用的解决方法. (5认同)

小智 51

AWS RDS用户如果得到这个,那是因为您不是超级用户,根据aws文档,您不能成为一个.我发现我必须忽略这些错误.

  • 此错误阻止了我的恢复(AWS RDS pg_restore).忽略这些错误的任何提示? (5认同)
  • 我发现,在RDS上,问题是“对扩展的评论”,而不是“创建扩展”。删除评论,就可以了。 (2认同)

Sta*_*ica 20

对于使用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文档,从这个当前线程,或者以下建议,从谷歌的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

  • GCP 现在可以在他们的 [docs](https://cloud.google.com/sql/docs/postgres/import-export/exporting) 中使用确切的 `pg_dump` 命令:`pg_dump -U [USERNAME] --format =plain --no-owner --no-acl [DATABASE_NAME] \ | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' &gt; [SQL_FILE].sql` (3认同)

Ric*_*ton 12

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

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


Cha*_*iam 11

更短的答案:忽略它.

该模块是处理SQL语言的Postgres的一部分.该错误通常会作为复制远程数据库的一部分弹出,例如使用'heroku pg:pull'.它不会覆盖您的SQL处理器并向您发出警告.


Lig*_*mer 5

-L通过指定从以下位置获取的文件,尝试将标志与pg_restore一起使用pg_dump -Fc

-L list-file --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
Run Code Online (Sandbox Code Playgroud)

在这里您可以通过仅输出注释来看到“ 逆”为真:

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
--
Run Code Online (Sandbox Code Playgroud)


Art*_*ley 5

对于使用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

  • 或者在转储时省略注释:`pg_dump --no-comments`。 (5认同)