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.html和https ://www.postgresql.org/docs/current/static/sql-alterrole.html.
小智 51
AWS RDS用户如果得到这个,那是因为您不是超级用户,根据aws文档,您不能成为一个.我发现我必须忽略这些错误.
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
Ric*_*ton 12
在这种情况下,您可以安全地忽略错误消息.未能向公共模式添加注释并安装plpgsql(应该已经安装)不会导致任何实际问题.
但是,如果要完全重新安装,则需要具有适当权限的用户.当然,这不应该是您的应用程序常规运行的用户.
Cha*_*iam 11
更短的答案:忽略它.
该模块是处理SQL语言的Postgres的一部分.该错误通常会作为复制远程数据库的一部分弹出,例如使用'heroku pg:pull'.它不会覆盖您的SQL处理器并向您发出警告.
-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)
对于使用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
| 归档时间: |
|
| 查看次数: |
92905 次 |
| 最近记录: |