はじめに
この記事では、PostgreSQLのサーバーを起動するときに
$ pg_ctl start
waiting for server to start....2020-04-23 14:29:14.708 JST [888] LOG: starting PostgreSQL 12.2 on x86_64-apple-darwin18.7.0, compiled by Apple clang version 11.0.0 (clang-1100.0.33.17), 64-bit
2020-04-23 14:29:14.709 JST [888] LOG: could not bind IPv6 address "::1": Address already in use
2020-04-23 14:29:14.709 JST [888] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2020-04-23 14:29:14.710 JST [888] LOG: could not bind IPv4 address "127.0.0.1": Address already in use
2020-04-23 14:29:14.710 JST [888] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2020-04-23 14:29:14.710 JST [888] WARNING: could not create listen socket for "localhost"
2020-04-23 14:29:14.710 JST [888] FATAL: could not create any TCP/IP sockets
2020-04-23 14:29:14.710 JST [888] LOG: database system is shut down
stopped waiting
pg_ctl: could not start server
のようなエラーがでた時の対処法を書きます。
エラーの意味
あのエラーの意味は、「ポート番号5432はすでにもう使われているから、もう5432にはサーバーを立てられないよ!(1行目参照)」です。
私の場合は昨日使っていたサーバーが残っています。
私は、PostgreSQLのサーバーを立ち上げる時、毎回ターミナルで
$ pg_ctl start
を打ち、閉じる時は
$ pg_ctl stop
を打って閉じています(自動化してくれるような方法があれば教えて欲しい...)
ただ、stopをし忘れたままPCをシャットダウンしてしまう時があり、そうなると冒頭に書いたようなエラーが出ます。
たまにエラーにハマって時間を取られてしまうわけですが、今回、おそらく二度と悩まずに済むような方法を見つけたので、ここに書きます。
試したこと(途中で解決する可能性もあり)
念の為、PostgreSQLにサーバーが立ち上がっているかどうかを確認します。
$ pg_ctl status
pg_ctl: no server running
立ち上がっていませんね。
次にポート5432に何か立ち上がっているのかを見ます。
$ sudo lsof -i:5432
Password:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 65 postgres 4u IPv6 0x7e9b8bc85f43493d 0t0 TCP *:postgresql (LISTEN)
postgres 65 postgres 5u IPv4 0x7e9b8bc85eeb7cdd 0t0 TCP *:postgresql (LISTEN)
いました。
つまり、プロセスが残っているので、プロセスを消さねばなりません。プロセスを消すには、PIDファイルを消すことで完了するパターンが多いです。
$ rm /usr/local/var/postgres/postmaster.pid
これを実行してみてください。人によってはこれで解決です。ただし
No such file or directory
と言われた場合は読み進めてください。
postmaster.pidを見つける
ここからは割と地道です。
/usr/local/var/postgresにpostmaster.pidのファイルがない場合は、別のPostgreSQLフォルダの中にあるdataフォルダに入っている可能性があります。
私の場合ですが、このdataフォルダは管理者制限でロックがかかっていたので、ファイルパスを使うことは出来ませんでした。おそらく他の方もその可能性があるので、自力でファイルを探してみます。
1. dataファイルを見つける
Finderを開き、Mac SSD ▸ ライブラリ ▸ PostgreSQL ▸ 12(ここはバージョンによって数字が違う)へと進みます。
そうすると、中にdataと言うファイルがありますが、管理者制限でロックがかかっていると思います。
2. ロックを解除します。
フォルダをクリックし、 情報を見る ▸ 右下の南京錠マークをクリックしロック解除 ▸ パソコンのパスワード入力 ▸ everyoneのところが「アクセス不可」となっていると思うので、「読み/書き」に変更する
これでdataフォルダが開けるようになったと思います。
3. そしてその中にpostmaster.pidがあれば、ゴミ箱へ入れる。
4. パソコンを再起動
5. サーバーが起動するか確かめる⬇︎
$ pg_ctl start
waiting for server to start....2020-04-24 10:13:39.361 JST [629] LOG: starting PostgreSQL 12.2 on x86_64-apple-darwin18.7.0, compiled by Apple clang version 11.0.0 (clang-1100.0.33.17), 64-bit
2020-04-24 10:13:39.362 JST [629] LOG: listening on IPv6 address "::1", port 5432
2020-04-24 10:13:39.362 JST [629] LOG: listening on IPv4 address "127.0.0.1", port 5432
2020-04-24 10:13:39.363 JST [629] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2020-04-24 10:13:39.405 JST [630] LOG: database system was shut down at 2020-04-23 22:25:29 JST
2020-04-24 10:13:39.418 JST [629] LOG: database system is ready to accept connections
done
server started
こう表示されたら完了です。お疲れ様でした。