postgresql 导入postgres数据库而不使用角色

o4hqfura  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(8)|浏览(258)

我有一个用pg_dump导出的数据库,但现在当我尝试用以下命令再次导入时:

psql -d databasename < mydump.sql

尝试将角色授予不存在的人员失败。(错误显示“角色“xxx”不存在“)
是否有方法自动导入所有角色并将其设置为我的用户?

s1ag04yj

s1ag04yj1#

导入的默认行为是将所有不知道的角色替换为执行导入的角色。因此,根据您需要数据库的目的,您可能只需导入数据库并忽略错误消息即可。
引自http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE
在还原SQL转储之前,拥有转储数据库中的对象或被授予对象权限的所有用户必须已经存在。否则,还原将无法使用原始所有权和/或权限重新创建对象。(有时这是您想要的,但通常不是。)

fwzugrvs

fwzugrvs2#

您可能需要寻找的答案是将--no-owner添加到pg_restore命令中,与目前接受的答案不同,该命令应该创建当前用户的每个对象,即使转储中的角色在数据库中不存在。
所以pg_restore不会跳过任何元素,但是如果导入的一些元素由不同的用户拥有,那么据我所知,所有的记录现在将只由一个用户拥有。

svujldwt

svujldwt3#

对于pg_restore,您可以使用--role=rolename选项强制使用角色名来执行还原。但转储必须为非纯文本格式。
例如,可以使用以下命令转储:

pg_dump -F c -Z 9 -f my_file.backup my_database_name

然后您可以使用以下方法恢复它:

pg_restore -d my_database_name --role=my_role_name my_file.backup

有关详细信息:http://www.postgresql.org/docs/9.2/static/app-pgrestore.html

q1qsirdb

q1qsirdb4#

是的,您可以使用pg_dumpall的-g选项从源数据库中转储所有“全局”对象:

pg_dumpall -g  > globals.sql

然后在导入之前对目标数据库运行globals.sql。

kt06eoxx

kt06eoxx5#

我使用了以下代码:

pg_dump --no-privileges --no-owner $OLD_DB_URL | psql $NEW_DB_URL


https://www.postgresql.org/docs/12/app-pgdump.html


  • --无所有者
    不要输出命令来设置对象的所有权以匹配原始数据库。缺省情况下,pg_dump会发出ALTER OWNER或SET SESSION AUTHORIZATION语句来设置所创建数据库对象的所有权。除非脚本由超级用户启动,否则这些语句将在脚本运行时失败(或拥有脚本中所有对象的同一用户)。要使脚本可由任何用户还原,但将所有对象的所有权授予该用户,请指定-O。
    此选项仅对纯文本格式有意义。对于存档格式,可以在调用pg_restore时指定此选项。
    -x
    --无特权
    --无acl
    防止转储访问权限(授予/撤销命令)。
vu8f3i0k

vu8f3i0k6#

在新版本的pg_restore中,它会抱怨文本文件导入。
但是,你可以用awk删除这些行,你可以把它放到一个新文件中,确保它没有破坏任何东西,或者直接把它放到psql中,如下所示:

cat my-import-file.sql | awk '!/old-role/' | psql -U target_owner -d target_db_name -1 -v ON_ERROR_STOP=1
  • 用你的导入文件替换my-import-file.sql
  • target_owner替换为您的用户名
  • 用要创建的数据库的名称替换target_db_name
  • old-role替换为它所抱怨的角色

如果您有多个角色:

cat my-import-file.sql | awk '!/role1|role2|role3/' | psql -U target_owner -d target_db_name -1 -v ON_ERROR_STOP=1

这将删除所有提到该角色的行。所有内容将由登录到psql的用户创建。

gmxoilav

gmxoilav7#

如果您尝试使用pgadmin导入备份,请在恢复bd时启用此标志:

希望对你有帮助,干杯!

3bygqnnd

3bygqnnd8#

你可以创建一个新的角色,和你缺少的角色同名,然后导入转储,没有错误。
错误显示“角色“xxx”不存在“-因此创建它:)

相关问题