🕌

【PostgreSQL】database has a collation version mismatchへの対処法

2023/07/02に公開

PostgreSQLを使っていると次のエラーに遭遇することがあります。この記事ではこのエラーの原因と対処法について解説します。

2023-07-02 06:27:49.880 UTC [338] WARNING:  database "foo" has a collation version mismatch
2023-07-02 06:27:49.880 UTC [338] DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.36.
2023-07-02 06:27:49.880 UTC [338] HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE foo REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.

対処法

次のクエリを実行すると解決します。

-- foo はデータベース名
REINDEX DATABASE foo;
ALTER DATABASE foo REFRESH COLLATION VERSION;

原因

PostgreSQLは、データベースの照合順序 (collation)を計算するためにlibcまたはICUを使用します。データベースを作成した時点でのlibcまたはICUのバージョンと、現在のバージョンが異なる場合、インデックスが破損する危険性があるためこのような警告が表示されます。
私のケースでは、OSのアップデートでlibcのバージョンがv2.31からv2.36に変わったためこのような警告が表示されていたようです。

これを解決するには、REINDEXでインデックスを再構築し、ALTER DATABASE foo REFRESH COLLATION VERSIONでデータベースに記録されている照合順序のバージョン(libcやICUのバージョン)を更新する必要があります。
注意点として、ALTER DATABASE foo REFRESH COLLATION VERSIONは実際に照合順序が更新されているかどうかをチェックしません。REINDEXを実行しなければ、単に警告が消えるだけで問題を解決したことにはなりません。

なお、ALTER DATABASE foo REFRESH COLLATION VERSIONを実行してからREINDEXを実行しても恐らく問題はありません。

参考

https://dba.stackexchange.com/q/324649
https://forum.greenbone.net/t/the-database-was-created-using-collation-version-2-35-but-the-operating-system-provides-version-2-36/13562
https://www.postgresql.org/docs/15/sql-altercollation.html#SQL-ALTERCOLLATION-NOTES
https://www.postgresql.org/docs/15/sql-reindex.html

GitHubで編集を提案

Discussion