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".
ということで、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が表示されています
どうすれば直るのでしょうか?
80 AdamT 2013-02-16
公務発表:postmaster.pid
は絶対に削除しないでください。マジかよ。データの破損にはもってこいの方法
あなたはすでにPostgreSQLをインストールしていて、実行中のサーバを停止することなくデータディレクトリを削除しました。そのため、削除されたデータファイルを管理している孤児のPostgreSQLサーバプロセスが存在し、ファイルシステムにアクセスできなくなり、最後に開いていたファイルハンドルが閉じられると完全に削除されてしまいます。クラスタのデータディレクトリを削除してしまったので、pg_ctl
を使って通常のようにサーバをシャットダウンすることはできませんので、単純にプロセスを kill する必要があります。postmaster を殺せば (kill -9
は使わず、通常の kill で十分です)、他のプロセスもシャットダウンされます
これで、initdb
‘d のデータに対して新しいサーバを datadir で起動することができます
他の古いバージョンのPostgreSQLをアンインストールしない限り、軌道上での競合が発生する可能性が高いです
一言で言えば
cat /usr/local/var/postgres/postmaster.pid
1行目の番号をメモしてください
pidがpostgresのpostmasterのものであることをps
で確認してください
以下のコマンドで、’PID’ をメモしておいた番号に置き換えて、postmaster プロセスを終了させてください。ここでも、kill -9
やkill -KILL
は使わず、ただ単にkill
、つまりSIGTERM
を使ってください
kill PID
pidがpostgres postmasterのものではない場合、まだ実行中のkill
バックエンドを手動でkill
し、それらが実行されていないことを確認してからpostmaster.pid
を削除してください。(また、postmaster.pid
が他のVM/ホスト上でサーバが動作している可能性のある共有ストレージ上にないことを確認しなければなりません)
124 Craig Ringer 2013-02-17
もう一つの可能性としては、ハードシャットダウンをしていて、postgresのプロセスがpidファイルをクリーンアップしないまま死んでしまったということが考えられます。これは、私のラップトップのバッテリーが切れたときに起こります
このソリューションは本番システム用ではないので、postgresデーモンが実行されていないことを本当に確認する必要がありますが、私はコーディングのためにラップトップを使用しているので、データベースを再生成する必要があることを心配していません
そのポートで別のプロセスが実行されていたり、全く実行されていなかったりした場合は、pid ファイルを削除すればよいのです
rm /usr/local/var/postgres/postmaster.pid
と、postgresがすぐに正常に起動するようになります
そのポートで別のプロセスが実行されているかどうかを調べるには、以下のようにします
ps wax | grep `head -1 /usr/local/var/postgres/postmaster.pid`
Then run
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ファイルを削除するほど賢くなるべきではないのでしょうか?)
53 AlexChaffee 2014-05-28
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に感謝します。うまくいけば、あなたのお役にも立てると思います
8 Billy G 2014-11-13
HARD REBOOT INSTRUCTIONS
ハードリブート後に同じ問題が発生しました。postmaster.pid
ファイルの pid をチェックした後、プロセスが実行されていないことに気づきました。私は.pidファイルをハードに削除したくなかったので、代わりに.bash_profile
で作成したpg-stop
エイリアスを使用しました
pg_ctl -D /usr/local/var/postgres stop -s -m fast
For Reference
# 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
brew
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
4 Chris Miller 2016-04-25
私のコンピュータがクラッシュした後にこのエラーが出ました。PostgreSQLはこのエラーのために起動することすらできませんでしたので、プロセスを停止させても解決にはなりませんでした。単純にバックアップを取ってからpostmaster.pid
ファイルを削除すると、エラーが止まってPGが再び起動できるようになりました
1 Jeff 2015-05-17
postmaster.pid を削除することは、起動するたびに盲目的に行うのが実際にはまともなことです。私のシステムではそうしています。起動したばかりなので、Postgresプロセスが実行されていないことがわかりますし、もしあなたがクリーンでないシャットダウンから回復しているのであれば、このファイルがあなたの回復を妨げることになります
Postgresのためのより良い設計は、postmaster.pidファイルを/runファイルシステムに置くことで、再起動のたびに削除されることが保証されています。他の多くのサーバはこの方法で動作しています
1 giraffedata 2017-08-29
時々、謙虚なpg_ctl -w restart
がトリックを行うことができます 🙂
1 sekmo 2017-11-11