pg_restore错误:角色XXX不存在

时间:2016-05-17 08:52:03

标签: 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;

这样运行没有错误。

相应的pg_restore是:

    pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump

抛出错误:

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 ...

如果我以纯文本格式(-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;

尝试设置用户pgdba的权限,用户pgdev当然甚至不存在于仅具有用户pg_restore的目标系统上的用户,因此来自dump_thread的错误

在源db上,例如# \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 | 表的权限:

pgdba

快速解决方案是在目标群集上添加用户--no-owner并完成它。

但是driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 不应该首先考虑不在转储中包含所有者特定命令吗?

1 个答案:

答案 0 :(得分:26)

我意识到--no-owner-x不同。我将-x添加到所有pg_dump命令中,这意味着:

-x, --no-privileges          do not dump privileges (grant/revoke)

实际上排除了转储中有问题的GRANT / REVOKE命令。问题解决了。