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

PostgreSQL:如何通过pg_dump/pg_restore保留原备份的所有者?

解决PostgreSQL备份恢复与导出的所有者一致性问题

一、需要创建的核心对象及配置

  1. project1数据库角色(用户)
    原备份中所有对象(包括数据库本身)的所有者都是project1,必须先创建该角色:
    使用超级用户(如pgsqladmin)连接PostgreSQL实例,执行SQL:
-- 创建带登录权限的角色,设置密码(建议和项目方确认密码,或临时设置后再修改)
CREATE ROLE project1 WITH LOGIN PASSWORD 'your_password';
-- 赋予创建数据库的权限(因为备份包含DROP/CREATE DATABASE操作)
ALTER ROLE project1 CREATEDB;
  1. 配置pg_hba.conf允许连接
    错误提示no pg_hba.conf entry是因为服务器未授权project1用户从你的客户端IP连接,需修改配置:
  • 找到PostgreSQL服务器的pg_hba.conf文件(通常位于数据目录下)
  • 添加一条TCP/IP连接规则(根据PostgreSQL版本选择认证方式,如scram-sha-256或md5):
    host    project1    project1    你的客户端IP地址/32    scram-sha-256
    
  • 重新加载PostgreSQL配置(Windows下可通过重启服务或执行命令):
    pg_ctl reload -D "你的PostgreSQL数据目录路径"
    

二、正确恢复备份并保留所有者

不要使用--no-owner参数,用project1用户连接到系统默认数据库postgres执行恢复(因为备份会创建project1数据库,无法直接连接目标库):

.\pg_restore -h 'hostname' -p 32040 -U project1 -d postgres C:\Users\X\Dumps\project1.tar

三、数据转换后的所有者校验

转换数据过程中若创建了新对象(表、函数等),需确保其所有者为project1,执行以下SQL修正:

-- 修正表所有者
ALTER TABLE 你的新表名 OWNER TO project1;
-- 修正函数所有者
ALTER FUNCTION 你的新函数名(参数类型) OWNER TO project1;
-- 视图、序列等其他对象同理

四、导出符合要求的备份

导出时移除--no-owner参数,确保备份包含原所有者信息:

.\pg_dump -h 'hostname' -p 32040 -U project1 -d project1 -f C:\Users\X\Dumps\project1_transformed.tar

若使用超级用户pgsqladmin导出,需指定所有者并保留相关信息:

.\pg_dump --owner=project1 -h 'hostname' -p 32040 -U pgsqladmin -d project1 -f C:\Users\X\Dumps\project1_transformed.tar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:55:08