“致命:锁定文件“ postmaster.pid”已存在”


68

我只是通过重新安装了postgres brew install postgres

我跑了,initdb /usr/local/var/postgres -E utf8但是得到了:

The files belonging to this database system will be owned by user "atal421".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default text search configuration will be set to "english".

initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".

因此,我rm -rf在postgres文件夹中再次运行它:

 initdb /usr/local/var/postgres -E utf8

它说一切都很好:

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

因此,我运行了该命令并得到:

postgres -D /usr/local/var/postgres


FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 13731) running in data directory "/usr/local/var/postgres"?

现在,当我查看活动监视器时,可以看到6个postgress实例。

我该如何解决?


您可能会看到一个postgres具有postmaster和五个实用程序后端的实例。PostgreSQL是一个多进程的体系结构。
Craig Ringer

Answers:


104

公益公告:永不删除postmaster.pid。真。获得数据损坏的好方法。

您已经安装了PostgreSQL,并且在不停止正在运行的服务器的情况下删除了数据目录。因此,您现在有一些孤立的PostgreSQL服务器进程正在管理已删除的数据文件,因此它们在文件系统中不再可访问,并且在最后一个打开的文件句柄关闭时将被完全删除。您不能pg_ctl像通常那样关闭服务器,因为您已经删除了集群数据目录,因此您必须简单地终止进程。杀死邮政局长(千万不能使用kill -9,只是一个普通的杀都行),其余的将关停了。

然后,您将能够根据最新initdb的d数据在datadir中启动新服务器。

除非您卸载其他旧版本的PostgreSQL,否则很可能会遇到冲突。

简而言之:

cat /usr/local/var/postgres/postmaster.pid

记下第一行上的数字,这是邮局局长的pid

验证pspid是否为postgres邮政管理员的pid。

使用以下命令终止邮局主管进程,将“ PID”替换为您记下的数字。再说一次,不要使用kill -9kill -KILL,而只需使用Plain kill,即SIGTERM

kill PID

如果pid不是postgres postmaster的pid,则手动手动检查可能仍在运行的kill所有postgres后端,确认它们不再运行,然后再删除postmaster.pid。(您还必须验证postmaster.pid不在服务器可能正在其他VM /主机上运行的共享存储上)。


这对我有用!
Tone

这可行。有一个问题,我清空了垃圾箱,似乎其中有一些数据文件...不确定如何,但是它们确实存在。一旦我杀死了旧程序,它就可以正常工作。
丹·L

是的 那是当场。
Amos Folarin 2015年

7
应该提到的是,在硬崩溃之后,PID文件可能会继续存在,而进程将终止。在那种情况下,PID文件中的PID可以指向与Postgres无关的进程。对于这种情况,请参见第二个答案。
2016年

2
平原kill PID对我没有用。我需要kill -3 PID。就我而言,我已经关闭了计算机,这可能会杀死终端窗口,而无法正确停止进程。被kill -3 PID杀死的进程及其子进程成功地让我重新开始了postgres。
Paul Masri-Stone

46

另一种可能是您硬关闭了,而postgres进程死了而没有清理其pid文件。当笔记本电脑的电池耗尽时,这会发生在我身上。

该解决方案不适用于生产系统,您应该确保postgres守护程序未运行,但是我使用便携式计算机进行编码,因此我不担心需要重新生成数据库。

因此,如果该端口上正在运行其他进程(或根本没有进程),则只需删除pid文件即可,例如

rm /usr/local/var/postgres/postmaster.pid

并且postgres很快就会启动。

要了解该端口上是否正在运行其他进程,可以执行

ps wax | grep `head -1 /usr/local/var/postgres/postmaster.pid`

然后跑

tail -f /usr/local/var/postgres/server.log 

看看是否有效。你应该看到

FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
LOG:  database system was interrupted; last known up at 2014-05-25 09:41:32 PDT
LOG:  database system was not properly shut down; automatic recovery in progress

(或者至少那是我完成上述操作后才看到的内容:-))

(实际上,Postgres难道不应该聪明到意识到PID 933不存在任何过程并自行删除伪造的pid文件吗?)


1
对我来说就是这种情况。我有另一个进程恰巧在postmaster.pid文件指向的同一PID上运行。这是不正常关机(几天后通过自制程序在OSX上膝上型安装Postgres)之后的几天。
Jesse Buchanan 2014年

1
我的Mac挂在登录屏幕上,因此必须关闭电源。最终留下了一个引用PID的postmaster.pid文件,该文件在下次重启时被用于其他用途,并且postgres不会出现。我试图杀死PID(就像craig-ringer推荐的那样),但这没有帮助。但是,rm postmaster.pid为我工作。我看不到任何数据损坏(但无论如何,这只是一台开发机器)。
史蒂芬·卡宁

对我来说也是一样 我没有停止本地Rails服务器就关闭了Mac。
Bruno Paulino

1
每当发生这种情况时,我都会继续返回该线程-因为我永远不记得pid文件在哪里,所以我总是不得不查找它:P
haslo

Postgres.app发生在我身上。删除后,~/Library/Application Support/Postgres/data/postmaster.pid我重新启动并运行。
罗伯·约翰森

8

升级到优胜美地后,我尝试了所有这些方法都失败了,我的postgres(通过自制软件安装)中断了。

然后我偶然发现了这个博客文章:http : //ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres

首先,我需要创建丢失的目录,这些目录显然在升级过程中消失了(感谢Apple!)。

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

然后使用正常的自制启动序列再次启动postgres:

$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

感谢Ruckus Notes帮助解决我的问题。希望它也对您有帮助。


4

硬启动说明

硬重启后,我遇到了同样的问题。检查postmaster.pid文件的pid之后,我发现我没有进程在运行。我不想硬删除.pid文件,而是使用pg-stop在中创建的别名.bash_profile。这个别名只是运行

pg_ctl -D /usr/local/var/postgres stop -s -m fast

以供参考

# psql
alias pg-start='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start'
alias pg-stop='pg_ctl -D /usr/local/var/postgres stop -s -m fast'

日志输出后 pg-stop

LOG:  database system was interrupted; last known up at 2016-04-25 10:51:08 PDT
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/274FA10
LOG:  redo is not required
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
LOG:  database system was shut down at 2016-04-25 13:11:04 PDT

酿造

我想我还要在这里提到,如果您使用自制软件安装了postgres,则应该brew services看看。现在这就是我更喜欢启动/停止数据库的方式。

XXXXX:~ chris$ brew services list
Name       Status  User  Plist
mongodb    stopped
postgresql started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
redis      started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.redis.plist

酿造信息正是我所需要的,谢谢!
dnatoli

1

我认为计算机崩溃后,我收到了此错误。PostgreSQL甚至由于这个错误而无法启动,因此杀死进程不是解决方案。我只是备份然后删除了postmaster.pid文件,然后错误停止了,并且PG能够再次启动。


1

有时谦虚pg_ctl -w restart可以解决问题:-)


当最重要的答案是“ DOOMED”时就爱上!没什么!然后一个小命令就让我运行。(在我的情况下,pid /usr/pgsql/9.3/data/postmaster.pid辅助输入中不存在pid 。)
本体

0

实际上,盲目地在每次启动时删除postmaster.pid都是一件很不错的事情。这就是我的系统所做的。因为您刚刚启动,所以您知道没有Postgres进程正在运行,并且如果您要从不正常的关机中恢复,则该文件将在那里阻止您进行恢复。

对于Postgres更好的设计是将postmaster.pid文件放在/ run文件系统中,因此可以确保每次重新启动时将其删除。其他许多服务器也可以这样工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.