PostgreSQL 10GB文件打开提示权限被拒绝,SQL Shell、PgAdmin均报错如何解决?
问题排查与解决步骤
第一步:先确认操作的文件类型
首先明确你所说的10GB文件属于哪一类,不同类型的操作逻辑完全不同,操作方式错误会直接触发类权限报错:
pg_dump导出的逻辑备份文件(.sql/.dump/.bak格式)- 正在运行/其他实例的PostgreSQL数据目录文件
- 单表导出的裸数据文件
第二步:排查文件系统权限问题
你设置的普通共享权限不生效,是因为PostgreSQL服务使用独立的系统用户运行,和你当前登录的操作系统用户不是同一个账号:
- Windows环境:PostgreSQL 9.6默认使用
NETWORK SERVICE用户运行服务,右键点击目标文件/文件夹 → 安全 → 编辑 → 添加NETWORK SERVICE用户,给该用户分配读取+写入权限,不要仅给当前登录用户或者Everyone权限。同时不要把文件放在C:\Windows、C:\Program Files这类系统级受保护目录,这类目录即使改了权限也会被系统安全规则拦截。 - Linux/Mac环境:PostgreSQL默认使用
postgres系统用户运行,执行以下命令修改权限:
不要把文件放在# 备份文件权限设置 chown postgres:postgres /你的/文件/完整路径 chmod 644 /你的/文件/完整路径 # 如果是数据目录,权限改为700 chmod 700 /你的/数据目录/路径/root、/etc等管理员专属目录下,避免系统权限拦截。
第三步:解决PgAdmin返回退出码1的问题
PgAdmin 4 v4和PostgreSQL 9.6适配存在已知的大文件操作限制:
- PgAdmin图形化导入工具默认的单文件大小阈值远低于10GB,直接操作会触发无明确提示的失败,返回退出码1,不要用图形化工具操作10GB级文件,改用SQL Shell(psql)或者
pg_restore命令行工具操作。 - 如果是导入逻辑备份文件,操作命令参考:
-- psql客户端内导入.sql格式备份 \i '你的备份文件完整路径'# 系统命令行导入.dump格式备份 pg_restore -U 数据库用户名 -d 目标数据库名 -v '你的备份文件完整路径' - 如果是要替换数据目录,需要先停止PostgreSQL服务再替换,运行中的实例会锁死数据目录文件,操作时会直接报权限错误。
第四步:排查操作权限与文件合法性问题
- 如果你使用
COPY命令读写本地文件,需要登录的数据库用户有superuser权限,普通用户操作会报权限错误,可以改用\copy元命令替代,\copy是psql客户端级操作,不需要superuser权限。 - 如果是从其他实例复制来的数据目录,需要两个实例的大版本完全一致(均为9.6.x)、编译架构(32位/64位)、操作系统完全一致,否则无法正常挂载读取。
- 不要用普通文本编辑器直接打开10GB级的PostgreSQL备份/数据文件,极易触发内存不足、文件锁死导致的权限类报错,可以用
head(Linux)/type(Windows)命令查看文件头,确认文件是否为合法的PostgreSQL备份文件。
内容的提问来源于stack exchange,提问作者Grigroviska
相关产品推荐
相关产品推荐

