web-dev-qa-db-ja.com

"致命的:ロックファイル" postmaster.pid "は既に存在します"

brew install postgres経由で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".

だから、私はpostgresフォルダをrm -rfしてまた実行しました。

 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"?

今私が自分の活動モニターを見ると、私はpostgressの6つの例を見ることができます。

これをどのように修正しますか?

68
AdamT

公共サービスのお知らせ:postmaster.pidを削除しないでください。本当に。データ破損を防ぐための素晴らしい方法です。

あなたはすでにPostgreSQLをインストールしており、実行中のサーバを停止することなくデータディレクトリを削除しました。これで、削除されたデータファイルを管理している孤立したPostgreSQLサーバプロセスがいくつかあるので、それらはファイルシステムからアクセスできなくなり、最後に開いたファイルハンドルが閉じられると完全に削除されます。クラスタデータディレクトリを削除したので、通常のようにpg_ctlを使用してサーバーをシャットダウンすることはできません。したがって、単にプロセスを強制終了する必要があります。 postmasterを終了し(do not kill -9を使用します。通常のkillを実行するだけで)、残りも終了します。

そうすると、datadir内で新たなinitdbデータに対する新しいサーバーを起動することができます。

あなたがPostgreSQLの他の古いバージョンをアンインストールしない限り、あなたはトラックをめぐる衝突を経験する可能性が非常に高いです。

一言で言えば:

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

最初の行の番号を書き留めます。これは、ポストマスターのpidです。

Pidがpostgres postmasterのものであることをpsで確認してください。

次のコマンドでpostmasterプロセスを終了させ、 'PID'を書き留めた番号に置き換えます。繰り返しになりますが、kill -9kill -KILLは使用せず、単にkill、つまりSIGTERMを使用してください。

kill PID

Pidがpostgres postmasterのものではない場合、手動でkillまだ実行されている可能性のあるpostgresバックエンド、 verify それらが実行されていないこと、および のみ postmaster.pidpostmaster.pidが、サーバーが他のVM /ホストで実行されている可能性がある共有ストレージにないことも確認する必要があります)。

100
Craig Ringer

もう一つの可能​​性はあなたがハードシャットダウンをしていて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ファイルを自分自身で削除するほど賢くてはいけませんか?)

44
AlexChaffee

Yosemiteにアップグレードして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。うまくいけば、それもあなたに役立ちます。

8
Billy G

ハードリブートの指示

私はハードリブート後にこれと同じ問題を抱えていました。 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
4
Chris Miller

時々謙虚なpg_ctl -w restartがトリックをやることができる:-)

1
sekmo

私は私のコンピュータがクラッシュした後、私はこのエラーを受けた。 PostgreSQLはこのエラーのために起動することすらできませんでしたので、プロセスを終了させることは解決策ではありませんでした。単純にバックアップしてからpostmaster.pidファイルを削除すると、エラーが停止し、PGは再開できました。

1
Jeff

盲目的に、postmaster.pidを削除するのは、実際には毎回の起動時にやるべきことです。それが私のシステムがすることです。起動したばかりなので、Postgresプロセスが実行されていないことがわかります。また、不正なシャットダウンから回復している場合は、このファイルが存在して回復を妨げることになります。

Postgresのより良い設計はpostmaster.pidファイルを/ runファイルシステムに置くことでしょう。そのため、再起動のたびに削除されることが保証されています。他の多くのサーバーはそのように動作します。

0
giraffedata