- データベース
password authentication failedの原因と直し方
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期連続の黒字決算。