角色存储在集群中的什么位置,我该如何转储它们?

我做了一个db的pg_dump,然后将其加载到另一个集群中,但是我遇到了很多这些错误:

psql:mydump.sql:3621: ERROR:  role "myrole" does not exist 


因此,很明显,我的数据库转储不包含角色。我尝试转储'postgres'数据库,但那里也看不到角色。

我需要使用pg_dumpall --roles-only吗?

Postgresql版本8.4.8和9.1.4
操作系统:Ubuntu 11.04 Natty

#1 楼

来自CREATE ROLE文档:


请注意,角色是在数据库集群级别定义的,因此在集群中的所有数据库中均有效。


由于pg_dump转储单个数据库,因此您无法使用该实用程序提取角色。您建议的pg_dumpall --roles-only命令将完成工作-但是您可能需要过滤其输出,以便仅在新集群中创建所需的角色。

角色存储在pg_authid目录中,该目录实际上是与其他群集范围的表一起存储在PostgreSQL安装的data/global/子文件夹中。您可以通过pg_authid视图查询pg_roles的内容。

注意:您将需要超级用户权限才能转储角色。否则,您将在SELECTpg_authid上获得拒绝权限-甚至当超级用户授予SELECT权限时,您也会遇到相同的错误。但是,在这种情况下,您可以通过直接查询pg_authid来列出角色,将COPY查询到文件中,然后进行一些魔术操作以创建必要的CREATE ROLEALTER ROLE语句。

评论


您能否添加如何还原所有角色(即无需过滤)?

– Ethan Furman
16-10-15在16:52

要恢复所有角色,只需将pg_dumpall --roles-only的输出复制并粘贴到所需的psql shell中。或特定的CREATE ROLE和ALTER ROLE行

–费尔南多·法布雷蒂
18年8月7日,11:19



有什么比pg_dumpall --roles-only更快的方法吗?它不提供任何二进制输出,也不提供任何压缩:(这很慢,特别是通过psql装回时

– andilabs
20-10-9在9:39