You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用非超级用户Pguser99执行pg_restore恢复PostgreSQL备份的可行性问询

PostgreSQL备份恢复权限与跨集群恢复问题解答

场景说明

  • 存在PostgreSQL 16集群Pgdbc1,包含超级用户PostgresSuperUser、非超级用户Pguser99,以及Pguser99拥有的数据库Db55OwnedByPgUser99;
  • 由PostgresSuperUser使用pg_dump以归档格式导出Db55OwnedByPgUser99的备份集Db55BackupArchive324;
  • 操作系统用户OperatingSystemUserDFG具备pg_restore执行权限与备份文件读取权限,无超级用户密码,计划以Pguser99身份在Pgdbc1恢复备份。

核心问题

  1. 能否使用非超级用户Pguser99成功恢复由超级用户导出的该备份?
  2. 若要将该备份恢复至另一数据库集群Pgdbc2,是否需先在Pgdbc2创建同名同密码的Pguser99,以及其拥有的同名数据库Db55OwnedByPgUser99?

解答

问题1:非超级用户Pguser99能否恢复该备份

可以成功恢复,但需满足以下条件:

  • 直接连接到已存在的目标库:恢复时需指定连接到已有的Db55OwnedByPgUser99数据库(避免执行CREATE DATABASE操作,因为非超级用户默认无CREATEDB权限);
  • 备份内容无超级用户专属对象:由于备份的是Pguser99拥有的数据库,备份内的对象所有权均为Pguser99,不存在只有超级用户才能创建/恢复的系统级对象;
  • 使用正确的恢复命令:以Pguser99身份执行恢复,命令示例:
    pg_restore -U Pguser99 -d Db55OwnedByPgUser99 Db55BackupArchive324
    
    该命令会直接将备份内容恢复到已存在的目标库,无需超级用户权限。

问题2:跨集群Pgdbc2恢复的前置要求

需要提前创建同名用户,但密码无需与原集群一致;同时需要提前创建同名数据库并指定用户为所有者,具体如下:

  1. 必须创建同名用户Pguser99:备份内所有对象的所有者均为Pguser99,若Pgdbc2中无该用户,恢复时会因找不到角色而报错。创建命令(需超级用户执行):
    CREATE ROLE Pguser99 WITH LOGIN PASSWORD 'your_password';
    
    密码可根据Pgdbc2的安全策略设置,无需与原集群相同。
  2. 必须提前创建目标数据库:
    需以超级用户身份创建Db55OwnedByPgUser99并指定Pguser99为所有者,确保恢复时用户对库有完全权限:
    CREATE DATABASE Db55OwnedByPgUser99 OWNER Pguser99;
    
    若尝试通过pg_restore -C参数自动创建数据库,需先给Pguser99授予CREATEDB权限,但这种方式不如提前创建库更稳妥。

内容的提问来源于stack exchange,提问作者Stan Kirk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:43:19