今回はSQliteからDB(データベース)に切り替える際に起きた不具合の対処方法についてまとめておきます。
- ターミナルコマンド(ps / sudo / mv / mv )
- スーパーユーザーとは?
- Postgresの不具合対応
- 隠しディレクトリの表示方法
Contents
PostgreSQLと言うデータベースをMacにインストールし、
いざデータベース・サーバーに接続するべく、下記コマンドをターミナルで実行してみると…..
$pg_ctl start -D /usr/local/var/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つ目の作戦を試してみよう!!
まず最初に紹介する方法は、「postmaster.pid」をディレクトリから削除する方法です。
これを行う理由としては、先程ターミナル上で「usr/….(以下省略)」にpostmaster.pidが存在しているんじゃない?というヒントがあったからです。

ヒントあげま〜す。「”/usr/local/var/postgres”」で別のポストマスターが立ち上がってるで??
余談ですが、railsとかターミナルのエラーって割と参考になるので、ちゃんと読んで理解するようにした方が良いと思います。
では、本題に戻ってターミナルで「rm」コマンドを実行してみます。
$rm /usr/local/var/postgres/postmaster.pid
指定したファイル・ディレクトリを削除するコマンド。
使用方法:$ rm ファイル名 or ディレクトリ名
これで完了した場合はOKですが、状況によっては下のように怒られてしまいます。
No such file or directory

そんなん言われても無いもんはないの!!
なるほど。やるじゃん?
でもこっちもまだまだ作戦はあるよ?
前項の「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?
この記事を読んで、疑問に思うのが「usr」ディレクトリの存在かと思います。
そもそも「usr」ディレクトリとかなくない?
実は、コンピュータには「隠しディレクトリ」というものが存在しています。今回の「usr」も隠しディレクトリなので、普段は非表示になっているのです。
コンピュータの重要な情報が格納されているため、誤って削除してしまわないように普段は非表示になっているディレクトリ。
「隠しディレクトリ」は実はMacのFinderで以下の方法で簡単に見つかります。
まずはMacのFinderを開きます。
そうです。君に優しく微笑んでくれているアイコンです。

Finderを開くと、パソコンの上に「ファイル」やら「移動」などのタブが出てきます。
「移動」>「フォルダへ移動」を押すと、下のようにディレクトリを検索できる画面が出現します。

上の検索画面で、「usr/local/var/postgres」と入力し、移動すると「postgres」ディレクトリの中身が表示されます。
その中に、「postmaster.pid」があるかどうか確認することができます。
先程紹介した「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」コマンドが必要になる。
*スーパーユーザー:コンピューターの全てのファイルを編集やら削除を自由にできる最強のユーザー
1.ファイルやディレクトリの移動
→$ mv 元のファイル or ディレクトリ 変更後のファイル or ディレクトリ
2.ファイルやディレクトリの名称を変更
→$ mv 元のファイル or ディレクトリ 移動先のディレクトリ
上の「sudo」コマンドを実行し、パスワードを求められるので入力します。
*パスワードは入力しても画面に表示されませんが、ちゃんと入力できています
そして、「ls」コマンドで先程のディレクトリを覗いてみます。
$ls /usr/local/var/postgres/
選択したディレクトリの中にあるファイルを表示
そうすると何やら色々とできています。
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
今回はエラーの原因である「postmaster.pid」を削除する方法(作戦1)と名称を変えて別のファイル名にしてしまう方法(作戦2)を紹介しました。
どちらが良いのかということですが、個人的には作戦2の方が良いのではと思います。
理由としては、完全にpostmaster.pidを削除するのが怖いなあと感じたからです。
今回はここまでにしておきます。
また何か学んだら追記していきたいと思います。
コメントを残す