発生事象
普段、DBクライアントツールにTablePlusを使用しています。
いつも通りDockerで立ち上げているローカルのDBに接続しようとしたところ、
次のようなエラーが出て接続できなくなりました。
connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: role "postgres" does not exist
前日まで普通に使えてましたし、connectionの情報は保存していますので、
入力値を間違えたという可能性はありません。
Dockerも特にいじってません。
試してみたこと
roleの確認
role "postgres" does not exist
とあるので、
DBコンテナにアタッチしてPostgreSQLにログインし、roleが存在しているかどうかを確認しました。
結果、存在していました。
再起動
「再起動は全てを解決する」という名言があります(嘘)
ということで、とりあえず再起動してみました。
しかし状況変わらず。
DBクライアントツールのアンインストール
一度アンインストールし、再度インストールしてみました。
これでも解決せずでした。
原因
上記のように色々試しつつ、直近で何か変わったことしたかなーと考えていたところ、
ローカルでPostgreSQLを使用したい機会があったため、
homebrewでPostgreSQLをインストールし使っていたことを思い出しました。
これが何か悪さしていそうだと思い、さらに調査。
すると、ローカルで動作しているPostgreSQLがポート5432を占有していたために
TablePlusからDockerコンテナ内のPostgreSQLへの接続が競合していることがわかりました。
解決方法
ポート5432が他のプロセスによって占有されていないかを確認
以下のコマンドでプロセスの確認。
lsof -i :5432
実行結果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 2116 XXXX 7u IPv6 0x91d6bd0f8d32a8ab 0t0 TCP localhost:postgresql (LISTEN)
postgres 2116 XXXX 8u IPv4 0x91d6bd012679c10b 0t0 TCP localhost:postgresql (LISTEN)
ssh 8131 XXXX 26u IPv4 0x91d6bd01267988a3 0t0 TCP *:postgresql (LISTEN)
TablePlus 11229 XXXX 22u IPv4 0x91d6bd01268ddb83 0t0 TCP localhost:62633->localhost:postgresql (CLOSE_WAIT)
ローカルのPostgreSQLサービスが起動しており、このサービスがポートを占有しています。
ローカルのPostgreSQLを停止
以下のコマンドでPostgreSQLを停止します。
brew services stop postgresql@15
(自分の場合は15系を使用していたので@15
をつけました)
ポートが解放されたことを確認した後、
TablePlusで再度接続を試みると成功しました。
最後に
エラーメッセージが分かりづらいのもあり(言い訳)、無駄に時間を溶かしてしまいました。
一度冷静になってこれまでと違ったことをしていないか振り返ることが大切ですねー。。