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命令.问题解决了.
小智 10
要恢复数据库,请运行以下命令:
pg_restore -x --no-owner -d db_name backup.dump
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15263 次 |
| 最近记录: |