PostgreSQL创建表空间没有权限

时间:2013-12-02 06:50:10

标签: database postgresql

我为PostgreSQL创建表空间时遇到了问题。以下是步骤:

  1. mkdir /postgres
  2. chown postgres.postgres /postgres
  3. su - postgres
  4. psql
  5. create tablespace p1 location '/postgres'
  6. 在这一步中我收到了一个错误:

    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

1 个答案:

答案 0 :(得分:5)

我猜测你是在Mac OS X上,而你的PostgreSQL是以用户postgres_(请注意下划线)运行的,就像一些PostgreSQL软件包所使用的那样。

ps -ef | grep postgresps 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 Security GuideCentOS SELinux howto等。

也许最好的选择是只更改文件的SELinux上下文。见the documentation。您可以使用chcon,但在文件系统重新标记后,更改将丢失。最好使用链接手册下一页中讨论的semanage