PostgreSQL 12归档至指定目录时权限拒绝问题排查求助
问题分析与解决方案
核心原因:Ubuntu AppArmor 权限限制
Ubuntu 默认安装 PostgreSQL 时会启用 AppArmor 强制访问控制策略,该策略仅允许 PostgreSQL 进程访问预设路径(如默认数据目录 /var/lib/postgresql/12/main),你指定的归档目录 /data/db/postgres/archive 不在允许的访问列表中。即使文件系统层面权限配置正确,AppArmor 仍会拦截 PostgreSQL 服务的写入操作,导致权限拒绝报错。
验证 AppArmor 限制
执行以下命令查看当前 AppArmor 状态,确认 PostgreSQL 的 profile 是否处于 enforce 模式:
sudo aa-status
输出中若包含 postgresql 相关条目且状态为 enforce,则可确认是 AppArmor 导致的问题。
解决步骤
1. 修改 AppArmor 配置
推荐在本地配置文件中添加路径权限(避免系统升级覆盖默认配置):
编辑 /etc/apparmor.d/local/usr.sbin.postgres 文件,添加以下内容:
/data/db/postgres/archive/ r, /data/db/postgres/archive/** rw,
r:允许读取目录本身rw:允许读取和写入目录下的所有文件
2. 重新加载 AppArmor 并重启 PostgreSQL
sudo systemctl reload apparmor sudo systemctl restart postgresql@12-main
3. 优化归档命令(可选但推荐)
将 postgresql.conf 中的归档命令修改为带引号的形式,避免路径包含特殊字符时出现异常:
archive_command = 'cp "%p" "/data/db/postgres/archive/%f"'
额外检查
确认 PostgreSQL 数据目录下的 pg_wal 目录权限正常:
ls -ld /var/lib/postgresql/12/main/pg_wal
确保该目录归 postgres:postgres 所有,且权限为 drwx------。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

