由于锁文件权限被拒绝,无法启动Postgres服务器

20

我重新启动了我的Postgres服务器,但现在我检查了我的“pgstartup.log”日志文件。它显示:

creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

Success. You can now start the database server using:
/usr/bin/postgres -D /var/lib/pgsql/data
/usr/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start

FATAL:  could not open lock file "/tmp/.s.PGSQL.5432.lock": Permission denied
FATAL:  could not open lock file "/tmp/.s.PGSQL.5432.lock": Permission denied

你认为删除 /tmp/.s.PGSQL.5432.lock 文件可行吗?


按照定义,您可以从/tmp文件夹中删除任何内容。但是问题可能会再次发生,请检查您用于PostgreSQL的用户是否具有访问和删除/tmp文件的所有特权。 - mikus
9个回答

10
如果您确定没有其他Postgres进程在运行,请删除这两个文件并重试:
$ sudo rm /tmp/.s.PGSQL.5432.lock
$ sudo rm /tmp/.s.PGSQL.5432

然后,您将能够使用以下命令将服务器作为后台进程运行:

$ pg_ctl -D /usr/local/var/postgres start

如果您使用的是OS X,可以按照以下步骤将别名放置在.bash_profile文件中:
alias pgb='pg_ctl -D /usr/local/var/postgres start'

现在,请使用以下命令获取源代码:
$ source ~/.bash_profile

Postgres服务器将使用以下命令运行:

$ pgb

8

由于/tmp目录的权限设置,Postgres无法将文件写入其中。请以root用户身份在终端中执行以下命令:

chmod 1777 /tmp

7

通常情况下,PostgreSQL在正确终止时会删除锁定文件。

如果出现了一个不同用户运行的已经异常终止(比如对postmaster使用kill -9)的另一个PostgreSQL实例,则可能是由于这个原因导致的。

所以,如果您确定没有任何Postgres进程正在运行,可以无需担心地删除那个文件。您还应该使用ipcs命令检查是否存在任何陈旧的共享内存段,如果有,请使用ipcrm删除它。

可能最好的方法是重启服务器来解决所有这些问题。

P.S.:永远不要kill -9任何PostgreSQL进程。


1
请注意,这是套接字锁,而不是 postmaster.pid - Craig Ringer
是的,但我不知道如何在被杀死的postmaster旁边留下一个过期的锁定文件。另一种可能性是锁定文件不是过期的,持有它的postmaster仍在完全不同的“listen_address”上运行(TCP套接字在Unix之前打开)。 - mnencia

3

看起来你可能有另一个PostgreSQL实例在使用相同的端口,但是使用不同的用户,或者你之前以不同的用户启动了这个PostgreSQL实例,然后不正常地停止了它。

检查/tmp/.s.PGSQL.5432.lock的所有权:

ls -l /tmp/.s.PGSQL.5432.lock

这是否与您运行PostgreSQL的用户匹配?

删除/tmp/中的锁定文件是相对无害的。(但千万不要删除postmaster.pid锁定文件)。如果另一个PostgreSQL实例仍在运行,则将失去通过unix套接字连接到它的能力,或者您可能会收到有关无法绑定到tcp上的5432端口的错误。

我同意@mnencia的观点,如果易于操作和实用,重新启动服务器是最佳选择。


大家好, 感谢您们的建议。 - Sarthak Saxena

1

是的,我遇到了同样的问题,并通过运行以下命令解决了它:

$ sudo rm /tmp/.s.PGSQL.5432.lock $ sudo rm /tmp/.s.PGSQL.5432 $ pg_ctl -D /usr/local/var/postgres start

我杀掉了在端口5432上运行的Postgress服务,这是你永远不应该做的事情,这可能是无意中完成的。因此,运行上述命令将删除锁定文件,现在当您启动新的Postgres服务器时,它会为您创建一个新进程。


1
对我来说,这是数据库文件的权限问题,它是组/全局可读的。这是错误的!数据库文件应该是0700。Aft

0

感谢您的建议。 首先,我尝试更改锁定文件的权限,但没有成功。 后来,我删除了锁定文件,解决了我的问题。

谢谢


0

不确定,但我认为是另一个Postgres实例正在处理的锁定文件。

重新启动计算机,然后该实例将离开对该锁定文件的访问。然后Postgres服务器将启动。这对我有用。


0

谢谢。 我在尝试在我的 Mac 上安装 postgres,但是一直提示:FATAL: could not open lock file "/tmp/.s.PGSQL.5432.lock": Permission denied。

删除 /tmp/.s.PGSQL.5432.lock 文件后,服务器开始正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接