概要

PostgreSQLを13から15にメジャーアップグレードした後、作成したロールからデータベースにアクセスできなくなってしまいました。

その問題の解決方法を紹介します。

環境

  • PostgreSQL 15.0

問題について

PostgreSQL 15へアップグレードして使い始めてからすぐに、WebアプリケーションからPostgreSQLにアクセスできなくなってしまいました。原因を探すと、PostgreSQLのログに次の内容が書かれていました。

FATAL:  password authentication failed for user "ロール名"
DETAIL:  User "ロール名" does not have a valid SCRAM secret.

有効なSCRAM secretがないという内容のエラーメッセージがログに残っていました。つまり、外部からのアクセス時の認証に失敗しているということのようです。

SCRAM secretは、おそらくPostgreSQLのパスワードの保存に使われるハッシュのことを指しているものと考えられます。SCRAM-SHA-256という方法でハッシュ化して保存しているようですが、アップグレード時に、その情報が欠落してしまった可能性があります。

解決方法

この問題の解決方法として、改めてパスワードを設定する方法があります。

最初に、どのロールに有効なパスワードがないのかを確認します。確認のために、PostgreSQLに接続して、次のSQLを実行します。

SELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS has_upgraded FROM pg_authid WHERE rolcanlogin;

有効なパスワードがないのは、has_upgradedの列にfと書かれているロールです。

次に、パスワードの設定を行います。同じくPostgreSQLに接続して、次のコマンドを実行します。

\password ロール名

PostgreSQLのパスワード設定のコマンドを実行しています。ロール名は適当なものに置き換えて実行します。

私の環境では、この方法で改めてパスワードを設定し直すことで、問題を解決することができました。

さいごに

外部からPostgreSQLに接続できなくなったときには焦ってしまいました。解決方法は単純だったので良かったです。

同じ悩みを抱える人の参考になれば嬉しいです。