在恢复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 

我深入到pg_dump生成的纯文本SQL中,发现它包含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

我怎么能解决这个问题?

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

 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; 声明。

请记住,这不是多站点托pipe服务器上的最佳解决scheme,因此请分别指定各个angular色: https : //www.postgresql.org/docs/current/static/sql-set-role.html和https ://www.postgresql.org/docs/current/static/sql-alterrole.html 。

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

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

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

较短的答案:忽略它。

这个模块是处理SQL语言的Postgres的一部分。 这个错误通常会作为复制远程数据库的一部分popup,比如用'heroku pg:pull'。 它不会覆盖你的SQL处理器并警告你。

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

 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 

对我来说,我是用pgAdminbuild立一个数据库,似乎在创build数据库时设置所有者是不够的。 我必须导航到“公共”模式,并在那里设置所有者 (最初是“postgres”)。

对于使用Google云端平台的用户,任何错误都会停止导入过程。 就我个人而言,我遇到了两个不同的错误,这取决于我发出的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. The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.

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

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

这是我无法使用GCP文档中提供的命令,当前线程的提示或遵循Google Postgres团队的build议来解决的权限问题。 其中推荐发出以下命令:

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 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 pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql