PostgreSQLでFATAL: role “postgres” does not existが発生した場合の原因と対処法

cloud storage storage medium 7832676

PostgreSQLで以下のようにpsql -U postgresコマンドを入力するとエラーになるります。その原因と対処法を解説します。

% psql -U postgres
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL:  role "postgres" does not exist
目次

PostgreSQLコマンド構文

postgresql データベースコマンド

データベースに入る

$ psql <DB_NAME>
ユーザーを指定してデータベースに入る

$ psql -U <USER_NAME> <DB_NAME>

PostgreSQLではユーザー名をロール名と呼んでいます。以下ではユーザー名とロール名が混在していますが、同一の意味で用いています。

PostgreSQLのデータベース接続コマンドでは、ユーザー名とデータベース名両方が省略可能です。

-U <USER_NAME>を省略すると、ユーザー名は現在のmacのユーザー名を用います。

<DB_NAME>を省略するとmacのユーザー名のデータベースに接続しようとします。

ユーザー名とデータベース名を省略した場合としなかった場合の組み合わせは以下の4通りです。xxxは現在のmacユーザーです。

$ psql
ロール名 xxx で データベース xxxに接続

$ psql postgres

ロール名 xxx で データベース postgresに接続

$ psql -U xxx
ロール名 xxx で データベース xxx に接続

$ psql -U xxx postgres
ロール名 xxx で データベース postgres に接続

データベース接続コマンドの実行結果

インストールした状態で、各コマンドを実行すると以下の結果になります。

% psql
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL:  database "xxx" does not exist
% psql postgres
psql (14.6 (Homebrew))
Type "help" for help.
% psql -U xxx
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL:  database "xxx" does not exist
% psql -U xxx postgres
psql (14.6 (Homebrew))
Type "help" for help.

データベースとユーザー一覧

そもそもデータベースとユーザーには何が存在するのでしょうか。とりあえずログイン出来るpsql postgresを実行してpostgresに入り、確認してみます。

データベース一覧

postgres=# \l
                          List of databases
   Name    | Owner  | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+---------+-------+-------------------
 postgres  | xxx | UTF8     | C       | C     |
 template0 | xxx | UTF8     | C       | C     | =c/xxx        +
           |        |          |         |       | xxx=CTc/xxx
 template1 | xxx | UTF8     | C       | C     | =c/xxx        +
           |        |          |         |       | xxx=CTc/xxx

ユーザー情報一覧

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 xxx    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

データベース postgresとユーザーxxxのみが存在している状態のようです。

そのため、それぞれのコマンドは以下の結果となりエラーメッセージと整合性が取れる。

$ psql
ロール名 xxx で データベース xxxに接続
-> データベース xxx は存在しない

$ psql postgres
ロール名 xxx で データベース postgresに接続
-> OK

$ psql -U xxx
ロール名 xxx で データベース xxx に接続
-> データベース xxx は存在しない

$ psql -U xxx postgres
ロール名 xxx で データベース postgres に接続
-> OK

結論

psql -U postgresを実行した際に、FATAL: role “postgres” does not existが発生する原因は、role postgresが存在しない状態で、role postgresでログインしようとしているからです。

homebrew経由でインストールした際のmacユーザーのrole名が自動的に作成されているようですので、そのユーザー名を指定してログインすることで正常にログイン出来るようになります。

その際データベース名は唯一存在するpostgresを明示的に指定するか、省略することで暗黙にpostgresが指定されます。

psql -U xxx postgres

psql -U xxx

参考

エラーメッセージの内容は、role postgresは存在しないこの件に関する説明は以下のページが詳しいです。

FATAL: role “postgres” does not exist

よかったらシェアしてね!
目次