【postgreSQL】pg_ctl: could not start server 【デイトラ】


今回はSQliteからDB(データベース)に切り替える際に起きた不具合の対処方法についてまとめておきます。

今回学べること
  • ターミナルコマンド(ps / sudo / mv / mv )
  • スーパーユーザーとは?
  • Postgresの不具合対応
  • 隠しディレクトリの表示方法

Postgresが立ち上がらない!問題発生

PostgreSQLと言うデータベースをMacにインストールし、

いざデータベース・サーバーに接続するべく、下記コマンドをターミナルで実行してみると…..

$pg_ctl start -D /usr/local/var/postgres


ちなみにこのコマンドの意味はこんな感じです。
(全文暗記する必要絶対なし!)

Postgres接続のコマンド
  • pg_ctl
    →PostgreSQLのデータベースサーバ(postgres)を起動、停止、再起動
  • start
    →新しいデータサーバの起動
  • – D
    →データベースファイルの場所を指定します。
  • /usr/local/var/postgres
    →ディレクトリの場所。
    usrディレクトリの下のlocalの下の…..みたいな感じ。


一旦、「usr」ディレクトリがどこにあるのかはスルーしておきます。
後で別の方法があるので、そちらで解説します。


話を戻しますが、データベースサーバーを起動すると下記のようなエラーが返ってきました。

pg_ctl: another server might be running; trying to start server 
anyway waiting for server to start....2020-08-16 18:01:34.704 
JST [42917] FATAL:  lock file "postmaster.pid" already exists
2020-08-16 18:01:34.704 JST [42917] 
HINT:  Is another postmaster (PID 41025) running in data 
directory "/usr/local/var/postgres"? stopped waiting
pg_ctl: could not start server
Examine the log output.


こんな物、痛くも痒くもありませんね。
私、壁が多いほど燃える男なんで。


さて、エラーの内容を詳しく見ていきましょう。


不具合の内容を要約してみるとこんな感じですね。
色々と分からない単語が多いですが….

ターミナルさん
ターミナルさん

もう、postmaster.pid存在してるで?

「lock file “postmaster.pid” already exists」


ターミナルさん
ターミナルさん

ヒントあげま〜す。「”/usr/local/var/postgres”」で別のポストマスターが立ち上がってるで??

HINT: Is another postmaster (PID 41025) running in data
directory “/usr/local/var/postgres”?


なるほど。
「/usr/local/var/postgres」の中に、既に「postmaster.pid」が存在するなら、消してやれば良いのでは?


ということで、1つ目の作戦を試してみよう!!

【作戦1】何が何でもpostmaster.pidを削除

まず最初に紹介する方法は、「postmaster.pid」をディレクトリから削除する方法です。


これを行う理由としては、先程ターミナル上で「usr/….(以下省略)」にpostmaster.pidが存在しているんじゃない?というヒントがあったからです。

ターミナルさん
ターミナルさん

ヒントあげま〜す。「”/usr/local/var/postgres”」で別のポストマスターが立ち上がってるで??


余談ですが、railsとかターミナルのエラーって割と参考になるので、ちゃんと読んで理解するようにした方が良いと思います。

「rm」コマンドでフォルダを消してみる

では、本題に戻ってターミナルで「rm」コマンドを実行してみます。

 $rm /usr/local/var/postgres/postmaster.pid
[rmコマンド]

指定したファイル・ディレクトリを削除するコマンド。
使用方法$ rm ファイル名 or ディレクトリ名

これで完了した場合はOKですが、状況によっては下のように怒られてしまいます。

No such file or directory
ターミナルさん
ターミナルさん

そんなん言われても無いもんはないの!!


なるほど。やるじゃん?
でもこっちもまだまだ作戦はあるよ?

隠しディレクトリの中から postmaster.pidを探して削除

前項の「rm」コマンドを実行したけど、フォルダがないと言われた方はこの方法を試してください。

(記事の「postmaster.pidを見つける」の項目の部分です。)

PostgreSQLでcould not start serverと言われた時の対処法 – Qiita

こんにちは、プログラマーの就職を目指して学習している たこ です。 この記事では、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?


[Qiita記事の補足]隠しディレクトリについて


この記事を読んで、疑問に思うのが「usr」ディレクトリの存在かと思います。

そもそも「usr」ディレクトリとかなくない?



実は、コンピュータには「隠しディレクトリ」というものが存在しています。今回の「usr」も隠しディレクトリなので、普段は非表示になっているのです。

[隠しディレクトリ]

コンピュータの重要な情報が格納されているため、誤って削除してしまわないように普段は非表示になっているディレクトリ


「隠しディレクトリ」は実はMacのFinderで以下の方法で簡単に見つかります。

Macの隠しディレクトリを見つける方法

まずはMacのFinderを開きます。
そうです。君に優しく微笑んでくれているアイコンです。


Finderを開くと、パソコンの上に「ファイル」やら「移動」などのタブが出てきます。

「移動」>「フォルダへ移動」を押すと、下のようにディレクトリを検索できる画面が出現します。


上の検索画面で、「usr/local/var/postgres」と入力し、移動すると「postgres」ディレクトリの中身が表示されます。

その中に、「postmaster.pid」があるかどうか確認することができます。

[作戦2]「mv」コマンドでフォルダ名を変える

先程紹介した「rm」コマンドでフォルダを削除する方法で失敗した方は、この方法を試してください。

ちなみに僕もこれで成功しました。


まずターミナルで「mv」コマンドを実行してみます。

$sudo mv /usr/local/var/postgres/postmaster.pid 
/usr/local/var/postgres/postmaster.pid_bak

上のコードで何をしているかというと、「postmaster.pid」フォルダを「postmaster.pid_bak」フォルダという名称に変更しているだけです。

*「_bak」にしたのは、バックアップということが分かるようにしたかったからです。


ちなみに「sudo」コマンドを付けているのは、mvだけでは権限の問題で実行できない場合があるからです。

[sudoコマンド]

ルート権限(管理者権限)に切り替えるコマンド。
→コンピュータの重要なファイルはスーパーユーザーしか編集・削除できないため「sudo」コマンドが必要になる。

スーパーユーザー:コンピューターの全てのファイルを編集やら削除を自由にできる最強のユーザー


[mvコマンド] 〜移動・名称変更〜

1.ファイルやディレクトリの移動
→$ mv 元のファイル or ディレクトリ 変更後のファイル or ディレクトリ

2.ファイルやディレクトリの名称を変更

→$ mv 元のファイル or ディレクトリ 移動先のディレクトリ


上の「sudo」コマンドを実行し、パスワードを求められるので入力します。
*パスワードは入力しても画面に表示されませんが、ちゃんと入力できています


そして、「ls」コマンドで先程のディレクトリを覗いてみます。

 $ls /usr/local/var/postgres/


【lsコマンド】〜ディレクトリの中身を表示〜

選択したディレクトリの中にあるファイルを表示


そうすると何やら色々とできています。

PG_VERSION		pg_multixact		pg_tblspc
base			pg_notify		pg_twophase
global			pg_replslot		pg_wal
pg_commit_ts		pg_serial		pg_xact
pg_dynshmem		pg_snapshots		postgresql.auto.conf
pg_hba.conf		pg_stat			postgresql.conf
pg_ident.conf		pg_stat_tmp		postmaster.opts
pg_logical		pg_subtrans		postmaster.pid_bak

これは「postgres」ディレクトリの中に入っているフォルダの一覧です。


よく見ると、「postmaster.pid」ではなく、先程mvコマンドで名称変更した「postmaster.pid_bak」が存在しているのが分かります。


これでエラーが解消されたのではないでしょうか?


もう一度データベースサーバーを起動してみましょう。

$pg_ctl start -D /usr/local/var/postgres


無事サーバーが立ち上がりました!

waiting for server to start....2020-08-16 18:09:55.523 JST [43025] LOG:  starting PostgreSQL 12.4 on x86_64-apple-darwin19.5.0, compiled by Apple clang version 11.0.3 (clang-1103.0.32.62), 64-bit
2020-08-16 18:09:55.526 JST [43025] LOG:  listening on IPv6 address "::1", port 5432
2020-08-16 18:09:55.526 JST [43025] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2020-08-16 18:09:55.529 JST [43025] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2020-08-16 18:09:55.569 JST [43026] LOG:  database system was interrupted; last known up at 2020-08-16 17:43:24 JST
2020-08-16 18:09:55.658 JST [43026] LOG:  database system was not properly shut down; automatic recovery in progress
2020-08-16 18:09:55.664 JST [43026] LOG:  redo starts at 0/16714F8
2020-08-16 18:09:55.664 JST [43026] LOG:  invalid record length at 0/16715E0: wanted 24, got 0
2020-08-16 18:09:55.664 JST [43026] LOG:  redo done at 0/16715A8
2020-08-16 18:09:55.682 JST [43025] LOG:  database system is ready to accept connections
 done
server started


まとめ:ファイルを削除 vs ファイル名称を変更

今回はエラーの原因である「postmaster.pid」を削除する方法(作戦1)と名称を変えて別のファイル名にしてしまう方法(作戦2)を紹介しました。


どちらが良いのかということですが、個人的には作戦2の方が良いのではと思います。

理由としては、完全にpostmaster.pidを削除するのが怖いなあと感じたからです。


今回はここまでにしておきます。
また何か学んだら追記していきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です