FATAL: password authentication failed for user "tx" は、PostgreSQL へのパスワードでのログインが失敗したときのエラーです。 パスワードの打ち間違いだけでなく、ユーザー(ロール)が存在しない、パスワードが設定されていない、保存形式が合わない、期限が切れているときも、アプリや psql には同じ文しか表示されません。

本当の原因は、PostgreSQL サーバーのログの DETAIL に出ます。 確認環境で、原因ごとに出た DETAIL です。

サーバーのログの DETAIL 原因 直し方
Connection matched file "pg_hba.conf" line 125: ... パスワードの誤り 正しいパスワードを確かめる・設定し直す
Role "nouser" does not exist. ユーザー名の誤り(そのロールが無い) ユーザー名を直す、CREATE ROLE
User "pw_nopw" has no password assigned. パスワードが設定されていない ALTER ROLE ... PASSWORD '...'
User "pw_md5" does not have a valid SCRAM secret. md5 で保存されたパスワードで、scram-sha-256 のログイン パスワードを設定し直す(scram で保存される)
User "pw_exp" has an expired password. パスワードの期限切れ(VALID UNTIL) 期限を延ばす

確認環境:PostgreSQL 16.15(Ubuntu のパッケージ)、psycopg 3.3.6、PostgreSQL JDBC Driver 42.7.2(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「password authentication failedの原因と直し方」

まず確認:サーバーのログを見る

sudo tail -n 20 /var/log/postgresql/postgresql-16-main.log      # Ubuntu・Debian のパッケージの場合
nouser@reldemo FATAL:  password authentication failed for user "nouser"
nouser@reldemo DETAIL:  Role "nouser" does not exist.

アプリに返るエラーは同じでも、ログには理由が書かれています。 アプリ側のエラーだけでは、原因を区別できません。ログの場所はインストールの方法で違い、SHOW log_directory;・SHOW data_directory; で確かめられます。

どこで見るか 表示(確認環境)
psql FATAL: password authentication failed for user "tx"
Python(psycopg) psycopg.OperationalError(同じ文)
Java(JDBC) org.postgresql.util.PSQLException: FATAL: password authentication failed for user "tx"(SQLState 28P01)
サーバーのログ 上の文 + DETAIL(本当の理由)

原因1:md5 で保存されたパスワードと scram-sha-256

確認環境の PostgreSQL 16 では、パスワードを保存する形式(password_encryption)は scram-sha-256 でした。以前の版から移したユーザーや、password_encryption = 'md5' のときに作ったユーザーは、md5 の形式で保存されています。

SELECT rolname, left(rolpassword, 14) FROM pg_authid WHERE rolcanlogin;   -- スーパーユーザーで実行
tx      | SCRAM-SHA-256$
pw_md5  | md58bd7c40ee04          ← md5 で保存されている

pg_hba.conf が scram-sha-256 だと、md5 で保存されたユーザーは、正しいパスワードでもログインできませんでした(does not have a valid SCRAM secret)。

ALTER ROLE pw_md5 PASSWORD 'Md5-Pass1';     -- 同じパスワードでもよいので、設定し直す

設定し直すと scram の形式で保存され、ログインできました。 公式ドキュメントでも、md5 から scram-sha-256 へ移るときは、password_encryption を scram-sha-256 にして、全員のパスワードを設定し直す手順が書かれています。

pg_hba.conf パスワードの保存形式 結果
scram-sha-256 scram ログインできる
scram-sha-256 md5 失敗(valid SCRAM secret が無い)
md5 md5 ログインできる
md5 scram ログインできる(自動で scram を使う。公式ドキュメント)

原因2:pg_hba.conf の順番と、再読み込み忘れ

pg_hba.conf は、上から順に見て、最初に合った1行だけが使われます。 その行で失敗しても、下の行は試されません(公式ドキュメント)。

(あるユーザーだけパスワード無しで入れるよう、最後の行に追加した)
host    all      all       127.0.0.1/32   scram-sha-256      ← 125行目
...
host    reldemo  pw_nopw   127.0.0.1/32   trust              ← 134行目(最後に追加)
FATAL:  password authentication failed for user "pw_nopw"
DETAIL:  User "pw_nopw" has no password assigned.

125行目の all all に先に合ってしまい、134行目は使われませんでした。 134行目の内容を、125行目より上に移すと、ログインできました。特定のユーザー・DB の行は、all の行より上に書きます。

ログの DETAIL: Connection matched file ... line 125 で、どの行が使われたかが分かります。 意図した行と違えば、順番の問題です。

書き換えたら、再読み込み

SELECT pg_reload_conf();          -- スーパーユーザーで実行

pg_hba.conf を書き換えただけでは反映されず、再読み込みのあとに反映されました。 書き間違いがあると、再読み込みは行われません。

SELECT line_number, error FROM pg_hba_file_rules WHERE error IS NOT NULL;
135 | invalid authentication method "scram-sha256"
(サーバーのログ)
LOG:  invalid authentication method "scram-sha256"
LOG:  /etc/postgresql/16/main/pg_hba.conf was not reloaded

scram-sha256(ハイフンが1つ足りない)の書き間違いで、ファイル全体が再読み込みされませんでした。 pg_hba_file_rules で、再読み込みの前に確かめます。

原因3:パスワードに記号がある(接続 URL)

$ psql "postgresql://tx:Tx@Pass@localhost/reldemo"
psql: error: could not translate host name "Pass@localhost" to address

パスワードの @ が、URL の区切りと解釈されました。 URL に書くときは、記号を % の形に変えます。

記号 URL での書き方
@ %40
: %3A
/ %2F
# %23

確認環境でも、パスワード Tx@Pass を postgresql://tx:Tx%40Pass@localhost/reldemo と書くと、ログインできました。JDBC なら、URL ではなく getConnection(url, user, password) の引数でパスワードを渡すと、この問題は起きません。

原因4:環境変数に、以前のパスワードが残っている

echo $PGPASSWORD      # psql は、これがあると聞かずに使う
cat ~/.pgpass

psql は、環境変数 PGPASSWORD や ~/.pgpass にパスワードがあると、入力を求めずにそれを使います。 以前のパスワードが残っていると、正しく入力したつもりでも失敗します。

似ているが別のエラー

エラー 原因
Peer authentication failed for user -h を付けずに接続し、OS のユーザー名で認証された
database "xxx" does not exist 認証は通ったが、DB が無い

Peer 認証のエラーは、関連記事の「Peer authentication failedの直し方|PostgreSQL」で扱っています。

確認の手順(チェックリスト)

順番 確認すること 方法
1 本当の理由 サーバーのログの DETAIL
2 ロールがあるか \du、または SELECT rolname FROM pg_roles
3 保存形式 pg_authid の rolpassword が md5 で始まっていないか
4 どの行が使われたか ログの Connection matched ... line N
5 書き換えを反映したか pg_hba_file_rules の error、pg_reload_conf()
6 URL・環境変数 記号の % 変換、PGPASSWORD・~/.pgpass

よくある質問

Q. SQLSTATE は何ですか。 A. 28P01(invalid_password)です。確認環境の JDBC でも 28P01 でした。

Q. Docker の公式イメージで、環境変数のパスワードを変えたのにログインできません。 A. Docker Hub の postgres イメージの説明では、POSTGRES_PASSWORD などの環境変数は、データの保存先が空のときに起動した場合だけ効くとされています。ボリュームにデータが残っていると、以前のパスワードのままです(確認環境では試していません)。上の手順のとおり、サーバーのログの DETAIL で、パスワードの誤りかどうかを確かめます。

まとめ

  • パスワードの誤り・ロールが無い・未設定・md5・期限切れが、すべて同じエラーになる
  • 本当の理由はサーバーのログの DETAIL に出る
  • md5 で保存されたパスワードは、scram-sha-256 では通らない。パスワードを設定し直す
  • pg_hba.conf は最初に合った1行だけ。特定の行は all より上に。書き換えたら pg_reload_conf()
  • 書き間違いがあると再読み込みされない。pg_hba_file_rules で確認
  • URL の記号は %40 などに。PGPASSWORD の残りにも注意

参考・出典

確認日はいずれも 2026年10月11日です。

  • PostgreSQL 16 Documentation「The pg_hba.conf File」:https://www.postgresql.org/docs/16/auth-pg-hba-conf.html
  • PostgreSQL 16 Documentation「Password Authentication」:https://www.postgresql.org/docs/16/auth-password.html
  • Docker Hub「postgres」(Docker Official Image):https://hub.docker.com/_/postgres

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「password authentication failedの原因と直し方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?