用心打造
VPS知识分享网站

pg_restore 提示角色不存在,恢复时该保留原属主吗?

把 PostgreSQL 备份导入另一台 VPS 时,pg_restore 可能提示旧角色不存在。先看失败语句是在设置属主,还是在恢复权限,两种报错需要不同的处理。

数据库备份恢复到目标环境并映射角色的示意图

看失败语句在做什么

从恢复日志找到首个错误。ALTER ... OWNER TO指向属主恢复;GRANT或REVOKE则涉及权限。跳过源属主不会一并跳过原授权。

确认手里的备份格式

对自定义、目录或 tar 归档可用pg_restore -l backup.dump核对目录。纯文本 SQL 用 psql 执行,不能直接套用 pg_restore 参数。先确认归档来自可信来源。恢复会执行其中的 SQL。

根据需求决定保留还是重建

需要保留原权限关系时,先在目标端准备对应角色和成员关系,并使用具备必要权限的账号。允许重新设计属主时,可在事先建好的空测试库执行pg_restore --exit-on-error --no-owner -d restore_test backup.dump。恢复角色仍须具备创建对象的权限。

单独处理旧角色的授权

目标明确要重建授权时,可另加--no-acl跳过归档中的 GRANT 和 REVOKE,再按目标环境补授权。未重建应用权限前,不要切换生产连接。

用应用账号验收权限

可以在萤光云或LightNode的独立数据库恢复并比对对象、行数与扩展,再用应用角色验证预期读写,并确认无权访问的对象仍受限。恢复报错后检查目标是否留下半成品。没有事务保护时,前面成功执行的语句可能已提交。

FAQ

普通 pg_dump 会带全局角色吗? 不会,角色是集群级对象。

no-owner 会跳过数据吗? 不会。

no-acl 会补齐新权限吗? 不会,需要重新授权。

直接对正式库运行 clean 可以吗? 会删除待恢复对象,应先在隔离库演练。

上游扩展需要提前确认吗? 需要确认目标环境支持并允许安装。

温馨提示

恢复测试库应与生产库隔离。回放前确认连接目标、备份可读性以及应用账号权限,不要把恢复日志里的敏感连接信息发到公开渠道。

赞(0)
未经允许不得转载;国外VPS测评网 » pg_restore 提示角色不存在,恢复时该保留原属主吗?
分享到