PostgreSQL 13配置pg_wal符号链接启动报目录不存在如何解决
PostgreSQL迁移pg_wal后启动提示目录不存在的修复方案
核心报错原因
PostgreSQL启动时无法穿透pg_wal软链接访问到实际存储的WAL文件,该问题和软链接本身是否可见无关,由权限配置或系统访问限制导致,按以下优先级逐一排查修复即可。
1. 修正目录属主与权限配置
PostgreSQL对数据目录、WAL目录的权限校验极其严格,任何权限不符合预期都会被判定为目录无效:
- 你当前创建的软链接本身属主为postgres是符合要求的,但软链接指向的实际目录
/data/pg_wal_move的属主、权限大概率配置错误。 - 从你贴出的目录列表看,
pg_twophase、pg_xact等原有数据子目录属组为uuidd,属于异常配置,需要一并修复。
执行以下命令统一修正权限:
# 修正主数据目录属主属组(如果你的数据目录不是默认路径,自行替换为实际路径) chown -R postgres:postgres /var/lib/postgresql/13/main/ chmod 0700 /var/lib/postgresql/13/main/ # 修正新WAL目录属主属组 chown -R postgres:postgres /data/pg_wal_move chmod 0700 /data/pg_wal_move
注意:不要为了省事给目录设置755、777权限,PostgreSQL检测到目录存在组、其他用户的访问权限时,会直接判定为不安全目录拒绝使用。
2. 解除systemd的目录访问限制(Ubuntu 21.10默认触发)
通过apt源安装的PostgreSQL在Ubuntu系统上默认受systemd服务沙箱限制,服务进程仅能访问白名单内的路径,/data这类自定义路径默认不在白名单中,哪怕目录权限配置正确,进程访问时也会被系统拦截,表现为软链接存在但提示目录不存在。
修复步骤:
- 执行命令编辑服务覆写配置:
systemctl edit postgresql@13-main.service
- 在弹出的编辑器中写入以下配置,将新WAL目录加入服务读写白名单:
[Service] ReadWritePaths=/data/pg_wal_move
- 保存退出后重载systemd配置使其生效:
systemctl daemon-reload
3. 验证修复并启动服务
先切换到postgres用户验证目录可正常访问,避免启动时再次报错:
su - postgres -c "ls /var/lib/postgresql/13/main/pg_wal/"
命令执行后如果能正常列出类似000000010000000000000001格式的WAL段文件,说明软链接访问正常,直接启动服务即可:
systemctl start postgresql@13-main.service
兜底注意事项
- 如果移动WAL文件时PostgreSQL进程没有完全停止,可能出现WAL段文件损坏的情况,启动时如果提示WAL校验失败,优先从最近的备份恢复数据。
- 无备份的紧急场景下可以使用
pg_resetwal工具重置WAL日志,该操作会丢失未落盘的事务数据,仅作为最后兜底方案使用。 - Linux系统中软链接本身的权限不生效,无需反复修改软链接权限,访问控制完全以指向的目标目录权限为准。
内容的提问来源于stack exchange,提问作者m.nicolau
相关产品推荐
相关产品推荐

