/var/run/postgres 不断被删除,导致 postgres 无法启动。

默认情况下,我的PostgreSQL安装在/tmp目录中创建了一个套接字,但是我的psql命令行客户端在/var/run/postgresql/.s.PGSQL.5432目录中寻找。
为了解决这个问题,我编辑了postgresql.conf并将目录更改为
unix_socket_directories = '/var/run/postgresql/'

很遗憾,在/var/run目录中默认情况下没有postgresql目录。所以,我创建了它并启动了服务器,一切都正常运行。但是,当我关闭并重新启动服务器时,由于某种原因,/var/run/postgresql目录会消失。这导致postgres的启动崩溃,并显示以下错误信息:
FATAL: 无法创建锁文件"/var/run/postgresql/.s.PGSQL.5432.lock":没有该文件或目录
感谢您的帮助!

1/var/run 是一个指向 /run 的符号链接,主要用于临时创建文件(主要是 PID 文件和锁文件)。如果您希望将 PID 文件保存在永久位置,请将其放在其他地方,例如 /var/postgres-socket/ 或其他位置。 - Jos
@Jos,谢谢你的评论。我该如何让psql客户端在那里查找? - sparkyspider
1我相信 psql -h /var/postgres-socket/ 应该可以工作。请参考 https://www.postgresql.org/docs/9.3/static/libpq-connect.html。 - Jos
@ Jos,我仍然认为有更好的方法,但是你的方法正在起作用,我很感谢你的帮助,所以谢谢你。 - sparkyspider
1个回答

解决方案1(通过管理临时目录/run/postgresql、/var/run/postgresql)

目录/run/postgresql是一个临时目录。路径/var/run/postgresql通常是指向/run/postgresql的符号链接。

systemd-tmpfiles是管理此类临时文件和目录的机制。在启动过程中,systemd-tmpfiles会创建临时目录,并设置它们的所有者、组和权限。它可以在三个不同的位置读取配置文件。位于/etc/tmpfiles.d的文件会覆盖/usr/lib/tmpfiles.d和/run/tmpfiles.d中具有相同名称的文件。

我们可以通过以下方式使用systemd-tmpfiles机制,在启动时动态创建目录/run/postgresql:

echo "d /run/postgresql 0755 postgres postgres -" > /usr/lib/tmpfiles.d/postgresql.conf

解决方案2(通过重新定位PostgreSQL锁文件位置)
另一种解决此问题的方法是重新定位PostgreSQL锁文件的位置。我们可以通过以下查询来实现。
ALTER SYSTEM SET unix_socket_directories='<any-existing-path-with-valid-permissions>, /tmp';

在这里,我们可以为已经存在于系统上并且由postgres用户具备管理锁文件所需权限的任何路径提供PostgreSQL锁文件。