PostgreSQL合并两个实例到单服务器时提示角色不存在问题问询
根本原因
- PostgreSQL 10.7 版本的 pg_restore 存在已知报错显示偏差 BUG:当恢复 ACL 权限条目时,若权限涉及的对象所有者、角色继承链存在校验异常,报错信息中提示的缺失角色名会与实际执行语句中的角色不匹配,该问题在 PostgreSQL 11 及后续版本已修复。
- 两个实例的角色属性不一致是触发报错的核心原因:LIVE1 实例中
carol角色为NOINHERIT、NOLOGIN属性,而 TRAIN 实例中的carol为INHERIT、LOGIN属性。如果 LIVE1 中svcl01属于某角色组、或权限授予存在角色依赖关系,属性不一致会导致 PostgreSQL 执行授权时角色校验失败,触发不存在报错。 - 恢复命令未添加
--no-owner参数:pg_dump 默认导出对象所有者信息,若备份中对象的所有者角色在 TRAIN 实例的属性与源实例不匹配,也会触发权限校验类报错。
可行解决方案
- 方案1:保留权限自动恢复,提前对齐角色属性
首先使用pg_dumpall -r分别导出 LIVE1、LIVE2 的全量角色定义,合并属性后统一导入 TRAIN 实例,确保所有角色的 INHERIT、LOGIN 等属性与源实例完全一致;恢复时添加--no-owner参数跳过所有者校验即可,命令参考:pg_restore -j 4 --no-owner -d ${LIVE1DB} ${LIVE1DB}.dmp pg_restore -j 4 --no-owner -d ${LIVE2DB} ${LIVE2DB}.dmp - 方案2:跳过权限恢复,后续批量补全
对于培训测试环境,可直接添加--no-acl --no-owner参数跳过所有者和权限恢复,恢复完成后统一批量执行授权语句即可,操作成本最低,命令参考:pg_restore -j 4 --no-acl --no-owner -d ${LIVE1DB} ${LIVE1DB}.dmp pg_restore -j 4 --no-acl --no-owner -d ${LIVE2DB} ${LIVE2DB}.dmp - 方案3:升级 pg_restore 工具版本
使用 PostgreSQL 11 及以上版本的 pg_restore 工具恢复 10.7 版本的备份,高版本工具修复了报错显示错位问题,可直接定位具体缺失的权限依赖。
内容的提问来源于stack exchange,提问作者S. Nixon
相关产品推荐
相关产品推荐

