我为PostgreSQL创建表空间时遇到了问题.以下是步骤:
mkdir /postgres
chown postgres.postgres /postgres
su - postgres
psql
create tablespace p1 location '/postgres'
在这一步中我得到一个错误:
could not set permissions on directory "/postgres": Permission denied
目录所有权是正确的:
[root@dev ~]# ls -la /postgres ??? 8 drwxr-xr-x. 2 postgres postgres 4096 12? 2 13:17 . dr-xr-xr-x. 28 root root 4096 12? 3 06:57 ..
用户是 postgres
[root@dev contrib]# ps -ef|grep postgres postgres 1971 1 0 08:21 ? 00:00:01 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
我在CentOS上运行.
修复:setenforce 0
粗略猜测我会说你在Mac OS X上,你的PostgreSQL以用户身份运行postgres_
(注意下划线),就像一些PostgreSQL软件包一样.
ps -ef | grep postgres
或者ps aux|grep postgres
应该向您显示服务器正在运行的用户.确保该目录归该用户所有.
根据评论中的额外信息进行更新:
您使用的是CentOS,而不是Mac OS X.您的PostgreSQL以用户身份运行postgres
,该用户与目录的所有者相同.因此,您似乎可能遇到SELinux问题.如果仅出于测试目的,您运行:
setenforce 0
然后你能运行CREATE TABLESPACE
命令吗?(DROP
在SELinux暂时关闭后创建表空间;如果没有,重启,PostgreSQL将无法启动).
如果SELinux暂时禁用创建失败,则必须从SELinux策略中豁免PostgreSQL,在SELinux策略允许的位置创建表空间,或者在表空间目录中设置适当的SELinux属性,以便PostgreSQL可以对其进行操作.或者你可以完全关闭SELinux,但这并不是真的可取.
在dmesg中,或者在CentOS的SELinux帮助工具中,可能会有一些提示告诉您可以打开或关闭的特定SELinux布尔值来控制它.请参阅setsebool
命令帮助,Fedora安全指南,CentOS SELinux howto等.
也许最好的选择是只更改文件的SELinux上下文.请参阅文档.您可以使用chcon
,但在文件系统重新标记后,更改将丢失.最好使用semanage
链接手册下一页中讨论的内容.