我安装了 Centos7 机器,但遇到了重启后 postgres 无法启动的问题。即使我尝试手动运行该服务,我也遇到了
UTC FATAL: could not create lock file "/var/run/postgresql/.s.PGSQL.5432.lock": No such file or directory
仔细观察后,我发现/var/run/postgresql
重启后该事件不再存在。
所以实际上有几个问题,因为我在研究中没有找到明确的答案。
/var/run 中的目录是如何以及何时创建的,它是在启动服务时创建的还是以某种方式创建的?
什么原因导致这个特定问题发生并且重启后无法启动 postgres?
我以前从未见过这种行为,尽管平心而论,到目前为止我一直在使用 ubuntu。
谢谢
答案1
如果你检查/var/run
你的系统,你会发现它实际上是一个符号链接/run
:
# ls -ld /var/run
lrwxrwxrwx. 1 root root 6 Jan 19 09:12 /var/run -> ../run
如果你检查一下/run
,你会发现它实际上是一个tmpfs
挂载点:
# mount | grep /run
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
文件系统tmpfs
是内存文件系统:系统重启后,内存中的任何内容都会消失。正如 Federico 在其评论中所说,CentOS 7(以及 Fedora、RHEL 7 等)使用该systemd-tmpfiles
功能在系统启动时自动创建锁定目录和其他临时存储位置等内容。
CentOS 7 中包含的软件包postgresql-server
已经做了正确的事情:
# rpm -ql postgresql-server | grep tmpfiles
/usr/lib/tmpfiles.d/postgresql.conf
# cat /usr/lib/tmpfiles.d/postgresql.conf
d /var/run/postgresql 0755 postgres postgres -
如果您使用的是第三方 postgresql 包,请不要惊讶它无法与 CentOS 正确集成。您可以通过设置tmpfiles.d
此处显示的相同条目来手动更正。
答案2
将 unix_socket_directories = ' /tmp' # 逗号分隔的目录列表添加到您的 postgresql 配置文件中。该文件应该位于某个位置(在 RHEL 7.x 和 CentOS 7.x 上)
/var/lib/pgsql/9.5/data/postgresql.conf
或者
/var/lib/pgsql/数据/postgresql.conf
然后重新启动服务器,你的postgresql服务应该可以正常启动。