尝试将数据库从一个系统复制到另一个系统。涉及的版本是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);
不应该首先考虑不在转储中包含所有者特定命令吗?
答案 0 :(得分:26)
我意识到--no-owner
与-x
不同。我将-x
添加到所有pg_dump
命令中,这意味着:
-x, --no-privileges do not dump privileges (grant/revoke)
实际上排除了转储中有问题的GRANT
/ REVOKE
命令。问题解决了。