「致命的:ロックファイル "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"?

アクティビティモニターを見ると、postgressのインスタンスが6つ表示されています。

どうすれば修正できますか?


おそらく、ポストマスターと5つのユーティリティバックエンドを持つ1つのインスタンスが表示されますpostgres。PostgreSQLはマルチプロセスアーキテクチャです。
クレイグリンガー

回答:


104

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

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

その後、新しくinitdb作成されたデータに対してdatadirで新しいサーバーを起動できます。

他の古いバージョンのPostgreSQLをアンインストールしない限り、今後競合が発生する可能性が高くなります。

手短に:

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

最初の行の番号をメモします。これは、ポストマスターのPIDです。

pspidがpostgresポストマスターのものであることを確認してください。

次のコマンドでポストマスタープロセスを強制終了し、「PID」を書き留めた番号に置き換えます。繰り返しますが、またはを使用しないkill -9kill -KILLkillSIGTERMください。プレーンを使用しください。

kill PID

pidはPostgresのポストマスターのものでない場合は、手動でkill任意のpostgresまだ実行することができるバックエンドは、検証しない、彼らはもはや実行して、していることだけにして取り除きますpostmaster.pid。(またpostmaster.pid、サーバーが他のVM /ホストで実行される可能性がある共有ストレージ上にないことを確認する必要があります)。


これは私のために働いた!
トーン

これは動作します。ゴミ箱を空にする問題があり、おそらくそこにいくつかのデータファイルがあったようです...どのように、しかし、彼らはそうでした。古いプロセスを強制終了すると、正常に機能しました。
ダンL 14年

ええ。それはスポットでした。
アモスフォラリン

7
ハードクラッシュの後、プロセスが停止する間、PIDファイルが存続する可能性があることに注意してください。その場合、PIDファイルのPIDは、Postgresとは何の関係もないプロセスを指すことができます。その場合の2番目の回答を参照してください。
16年

2
平野kill PIDは私にはうまくいきませんでした。が必要でしたkill -3 PID。私の場合、プロセスを適切に停止せずにターミナルウィンドウを強制終了した可能性があるシャットダウンを実行しました。kill -3 PIDプロセスを殺して、その子が正常に私は再びpostgresのを開始させます。
ポールマスリストーン

46

もう1つの可能性は、ハードシャットダウンが発生し、pidファイルをクリーンアップせずにpostgresプロセスが終了したことです。これは、ラップトップのバッテリーが切れたときに起こります。

このソリューションは実稼働システム用ではなく、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で別のプロセスが偶然実行されていました。これは、クリーンシャットダウン(homebrewを介したOSXへのPostgresのラップトップインストール)の数日後です。
ジェシーブキャナン14年

1
ログイン画面でMacがハングし、電源を切る必要がありました。その結果、POSTを参照するpostmaster.pidファイルが残り、PIDは次の再起動時に他の何かに使用され、postgresは起動しませんでした。PIDを強制終了しました(クレイグリンガーが推奨する投稿のように)が、助けにはなりませんでした。しかし、rm postmaster.pid私のために働いた。データの破損はありません(ただし、いずれにしても、これは単なる開発マシンです)。
スティーブンシャニン

私にとっても同じことです。ローカルRailsサーバーを停止せずにMacをシャットダウンしました。
ブルーノ

1
私はこれが起こるたびにこのスレッドに戻り続けます
-pid

これはPostgres.appで私に起こりました。削除した後、~/Library/Application Support/Postgres/data/postmaster.pid私は稼働していた。
ロブヨハンセン

8

Yosemiteへのアップグレード後にpostgres(homebrewでインストール)が壊れた後、これらすべてを試してみました。

それから私はこのブログ投稿につまずいた: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ファイルを完全に削除したくありませんでした。代わりに、.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

醸造

ここで、homebrewで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がトリックをすることができます:-)


一番の答えがあなたに夢中だという愛がある!何も触れないでください!そして、1つの小さなコマンドで実行されます。(私の場合、pid /usr/pgsql/9.3/data/postmaster.pidauxはps auxに存在しませんでした。)
ヌメノン

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.