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