pg_restore错误:角色XXX不存在

Tha*_* K. 36 database postgresql restore

尝试将数据库从一个系统复制到另一个系统.涉及的版本是9.5.0(源)和9.5.2(目标).

源数据库名称foodb与所有者pgdba和目标数据库名称将foodb_dev与所有者命名pgdev.

所有命令都在将托管副本的目标系统上运行.

pg_dump命令是:

    pg_dump -f schema_backup.dump --no-owner -Fc -U pgdba -h $PROD_DB_HOSTNAME -p $PROD_DB_PORT -d foodb -s --clean;
Run Code Online (Sandbox Code Playgroud)

这运行没有错误.

相应的pg_restore是:

    pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump
Run Code Online (Sandbox Code Playgroud)

抛出错误:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 3969; 0 0 ACL public pgdba
pg_restore: [archiver (db)] could not execute query: ERROR:  role "pgdba" does not exist
Command was: REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM pgdba;
GRANT ALL ON SCHEMA public TO pgdba;
GRANT ...
Run Code Online (Sandbox Code Playgroud)

如果我以纯文本格式(-Fp)生成转储文件,我看到它包括几个条目,如:

REVOKE ALL ON TABLE dump_thread FROM PUBLIC;
REVOKE ALL ON TABLE dump_thread FROM pgdba;
GRANT ALL ON TABLE dump_thread TO pgdba;
GRANT SELECT ON TABLE dump_thread TO readonly;
Run Code Online (Sandbox Code Playgroud)

尝试为用户设置权限pgdba,当然这些用户甚至不存在于仅具有用户的目标系统上的用户pgdev,因而也是来自的错误pg_restore.

在源db上,例如dump_thread表的权限:

# \dp+ dump_thread
Access privileges
-[ RECORD 1 ]-----+--------------------
Schema            | public
Name              | dump_thread
Type              | table
Access privileges | pgdba=arwdDxt/pgdba+
                  | readonly=r/pgdba
Column privileges |
Policies          |
Run Code Online (Sandbox Code Playgroud)

一个快速的解决方案是简单地pgdba在目标集群上添加用户并完成它.

但是,首先应该--no-owner注意不要在转储中包含所有者特定的命令?

Tha*_* K. 37

我意识到这--no-owner不一样了-x.我添加了-x所有pg_dump命令,这意味着:

-x, --no-privileges          do not dump privileges (grant/revoke)
Run Code Online (Sandbox Code Playgroud)

这实际上排除了转储中的违规GRANT/ REVOKE命令.问题解决了.

  • `pg_restore --no-privileges --no-owner ...`允许您指定在恢复时不包含所有权或特权,无论这些特权和所有权是否包含在`pg_dump`中 (41认同)
  • 是否有任何方法可以在没有-x选项的情况下恢复数据库..在我的情况下转储是由其他人给予先生因此我不能修改它)x选项 (5认同)
  • 取消所有权和特权是否会带来任何不可预见的负面影响? (5认同)
  • @user1448319 这应该是答案。在恢复时跳过所有者/权限比在转储时跳过所有者/权限要好得多。 (3认同)
  • @l-youl:对于生产数据库,我很确定会有。正如 Hartmut 建议的那样,您最好在恢复之前重新创建角色。在这种情况下,OP 很可能并不关心,因为他们只是为了测试或查看数据而进行恢复。 (2认同)

小智 10

要恢复数据库,请运行以下命令:

pg_restore -x --no-owner -d db_name backup.dump
Run Code Online (Sandbox Code Playgroud)