不带角色导入PostgreSQL数据库

56

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

psql -d databasename < mydump.sql

尝试向不存在的人授予角色失败。(错误信息显示“角色“xxx”不存在”)

有没有一种自动导入和设置所有角色到我的用户的方法?

8个回答

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

6
在我第一次阅读这个答案的时候,我漏掉了其中写着"您可能只是没问题"这部分。为了澄清这个答案,当运行命令时,该命令很可能已经起作用了。显示的错误并没有阻止数据的导入。源中使用的角色在目的地中没有使用,并且与它们相关联的任何数据现在都将与运行命令的用户相关联。 - shanemgrey

36
您可能正在寻找的答案是将--no-owner 添加到pg_restore命令中。与当前已接受的答案不同,该命令应该使用当前用户创建每个对象,即使转储中的角色在数据库中不存在。
因此,pg_restore不会跳过任何元素,但如果导入的某些元素归不同的用户所有,则据我所知,所有记录现在都将归一个用户所有。

2
如何使用psql实现?那就是问题。 - Smith

19

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

这是关于it技术的内容,其中包含了有关pgrestore的信息。请点击上述链接以获取详细信息。

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

在导入之前,请先运行globals.sql文件到目标数据库。

7

我使用了以下内容:

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

来自

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

-O

--no-owner

不生成设置对象所有权以匹配原始数据库的命令。默认情况下,pg_dump会发出ALTER OWNER或SET SESSION AUTHORIZATION语句来设置创建的数据库对象的所有权。除非由超级用户(或拥有脚本中所有对象的同一用户)启动脚本,否则这些语句将在运行脚本时失败。为了使脚本可以被任何用户恢复,但是将其所有对象的所有权都赋予那个用户,请指定-O。

此选项仅对纯文本格式有意义。对于存档格式,您可以在调用pg_restore时指定该选项。

-x

--no-privileges

--no-acl

防止转储访问权限(授予/撤销命令)。


1
在较新的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的用户创建并拥有。

0

如果您正在使用pgadmin导入备份,请在恢复数据库时启用此标志: 输入图像描述

希望能对您有所帮助。 祝好!


-6

你可以创建一个与缺失角色同名的新角色,然后导入转储文件,这样就不会出现错误了。

错误提示说“角色 'xxx' 不存在” - 所以创建它即可 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接