postgresql pg_restore错误:角色XXX不存在

z9gpfhce  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(395)

尝试将数据库从一个系统复制到另一个系统。涉及的版本为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表的权限为例:

# \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难道不应该一开始就注意不要在转储中包含所有者特定的命令吗?

6ss1mwsb

6ss1mwsb1#

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

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

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

bvn4nwqk

bvn4nwqk2#

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

pg_restore -x --no-owner -d db_name backup.dump
nkhmeac6

nkhmeac63#

使用以下命令恢复DB备份
pg_restore --无权限--无所有者-h本地主机-p<DB_Port>-U<DB_User>-d<DB_Name>-1<DB_Backup_Path>
使用标记**--no-privileges**防止恢复访问权限(授予/撤销命令)和

--no-owner防止将对象的所有权设置为与原始数据库匹配

相关问题