Postgres改变文件权限会对其造成不利影响。

有人,请,请,请告诉我这里到底发生了什么鬼,以及我该如何解决?

我会让我的控制台来说话:

root@worker2:/var/run# service postgresql start
 * Starting PostgreSQL 9.3 database server                                                           * The PostgreSQL server failed to start. Please check the log output:
2016-01-15 10:47:08 PST FATAL:  could not create lock file "/var/run/postgresql/.s.PGSQL.5432.lock": Permission denied
                                                                                             [fail]
root@worker2:/var/run# chmod 777 postgresql
root@worker2:/var/run# ls -l |grep post
drwxrwsrwx 2 postgres    postgres       40 Jan 15 10:24 postgresql
root@worker2:/var/run# chmod g-s postgresql
root@worker2:/var/run# ls -l |grep post
drwxrwxrwx 2 postgres    postgres       40 Jan 15 10:24 postgresql
root@worker2:/var/run# service postgresql start
 * Starting PostgreSQL 9.3 database server                                                           * The PostgreSQL server failed to start. Please check the log output:
2016-01-15 10:47:48 PST FATAL:  could not create lock file "/var/run/postgresql/.s.PGSQL.5432.lock": Permission denied
                                                                                             [fail]
root@worker2:/var/run# ls -l |grep post
drwxrwsr-x 2 postgres    postgres       40 Jan 15 10:24 postgresql

请注意,当我尝试启动守护进程时,文件夹 /var/run/postgresql 的权限从 777 更改为 775,并在组上设置了粘性位。实际上,守护进程会更改这些权限以破坏操作。如果我可以永久将其更改为 777,至少我可以找出 postgresql 用户实际上是以什么身份运行的,并进行修复。但是,守护进程却更改其权限以破坏操作。 - Ernie Dunbar
3个回答

我遇到了完全相同的问题。我仍然不知道是什么原因导致的,但是作为一种解决方法,我改变了postgresql的pid文件目录和unix套接字目录(尽管也许前者并不是必要的)。在这个回答中,我将称这个新目录为/pg_workaround
mkdir /pg_workaround
chown postgres:postgres /pg_workaround
chmod 777 /pg_workaround

然后编辑/etc/postgresql//main/postgresql.conf并修改以下行:
external_pid_file = '/pg_workaround/<version>-main.pid'
unix_socket_directory = '/pg_workaround'

(将/pg_workaround替换为所需的位置,将<version>替换为您实际使用的Postgres版本。)

1在Postgresql 9.3+中,它是unix_socket_directories。 - Jason Crease

检查 /var/run/postgresql 的所有者,并将其设置为 postgres(如果尚未设置)。要执行此操作,请输入以下命令:
sudo chown -R postgres:postgres /var/run/postgresql**
如果您当前使用的用户没有sudo权限,则需要执行以下步骤:
1)切换到root用户
su -
2)将/var/run/postgresql的所有权更改为postgres用户和postgres组
chown -R postgres:postgres /var/run/postgresql
我在安装Ubuntu 14.04上的PostgreSQL时遇到了同样的问题,通过更改所有权解决了该问题。

请仔细阅读我的输出。那正是我所做的。看起来正在发生的事情是,Postgresql实际上会更改此文件的权限,以便与Postgresql服务器实际运行的任何用户不兼容(即不是postgres,否则上面的权限实际上会起作用 - 是的,我已经测试过在/var/run/postgresql中以postgres用户身份编写文件)。 - Ernie Dunbar
我看到你使用了chmod而不是chown! - Saleh Salem
root@worker2:/var/run# chown -R postgres:postgres /var/run/postgresql root@worker2:/var/run# service postgresql start
  • 正在启动 PostgreSQL 9.3 数据库服务器 * PostgreSQL 服务器启动失败。请检查日志输出: 2016-01-19 08:50:36 PST 致命错误:无法创建锁文件 "/var/run/postgresql/.s.PGSQL.5432.lock":权限被拒绝
- Ernie Dunbar
已经将其更改为postgresql:postgresql,再次更改并没有改变任何内容。这个目录中没有任何东西。文件/var/run/postgresql/.s.PGSQL.5432.lock不可能存在,即使它存在且所有权正确,似乎PostgreSQL实际上是以另一个用户身份运行的,因为它无法写入此目录。 - Ernie Dunbar

这是一个通常在VPS上发生的错误结果,当操作系统和共享内核不一致时会出现。解决方法是创建一个定时任务,在每次重新启动时修复它,如下所示:
@reboot chown -R postgres:postgres /var/run/postgresql
有关此问题的更多详细信息,请参考:在重启后SSH服务器停止工作,原因是缺少/var/run/sshd