PostgreSQL-备份数据库并在其他所有者上还原?


83

我使用以下命令在不同服务器上的数据库上进行了备份,该角色具有与我所需角色不同的角色:

pg_dump -Fc db_name -f db_name.dump

然后,我将备份复制到需要还原数据库的另一台服务器上,但是没有用于该数据库的所有者。假设数据库具有owner owner1,但是在另一台服务器上只有owner2我,并且我需要还原该数据库并更改所有者。

还原时我在另一台服务器上执行的操作:

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --role=owner2 -d db_name db_name.dump

但是运行还原时,出现以下错误:

pg_restore: [archiver (db)] could not execute query: ERROR:  role "owner1" does not exist

如何指定它以便更改所有者?还是不可能?


1
除了--no-owner接受的答案中建议的那样,您可能还需要--no-privileges。看到这个答案
mivk

Answers:


130

您应该使用该--no-owner选项,这将停止pg_restore尝试将对象的所有权设置为原始所有者。而是对象将由以下用户指定--role

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --no-owner --role=owner2 -d db_name db_name.dump

pg_restore doc


14
pg_dump --no-owner也应该这样做
尼克·巴恩斯

10
我的偏好是将此类决策推迟到还原之前。如果在转储阶段执行此操作,则意味着不进行导出就无法改变主意。在恢复手段做的是选择留在情况下,你决定,你真的应该建立开放失踪角色等
加里

1
因此,如果要更改所有者,必须在没有所有者的情况下进行备份吗?因为我以为我可以在还原时更改所有者。但是,即使设置--role在不同的所有者,它仍然试图用原来的主人(但当时我没有使用--no-owner
安德

2
@Andrius:您不需要更改备份,Gary的答案应该可以解决您的问题
Nick Barnes

5
通过浏览有关该主题的所有帖子,他们似乎也跳过了以下事实:该方法要求新角色所有者成为超级用户,至少在还原期间是如此。然后一切正常
chrismarx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.