Subject: Collation again here

From: Rihad <[email-masked]>
Date: Thu, 8 Jan 2026 16:34:40 +0400

Hi, guys. Just pg_upgraded our PG from 13.x to 18.1, rebuilt all indexes 
concurrently and issued ALTER DATABASE foo REFRESH COLLATION VERSION

Everything's fine on the master server, no warnings etc. Then I set up a 
replica using pg_basebackup, and there when trying to access the DB 
using psql I get:

WARNING:  database "foo" has a collation version mismatch
DETAIL:  The database was created using collation version 43.0, but the 
operating system provides version 34.0.
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.
psql (18.1)
Type "help" for help.

(and I can't issue those same commands on the read-only replica).

The OS are both FreeBSD, but the master runs 14.3, the replica runs 
13.5. PostgreSQL packages are built with ICU support by default, the 
versions used are identical: icu-76.1

Could it be that the OS (libc) needs to be the same version? I hoped it 
would be enough to use the same ICU.

Thanks for any tips.

---

From: "Daniel Verite" <[email-masked]>
Date: Thu, 08 Jan 2026 14:19:21 +0100

> would be enough to use the same ICU.

That would be the case if the database collation provider was ICU,
that is pg_database.datlocprovider = 'i'
Otherwise no, it's the libc version that matters, unless using
the binary-sorting C or C.UTF-8 collations.
43.0 and 34.0 don't look like ICU collation version numbers, so
they probably refer to FreeBSD libc (pg_database.datlocprovider = 'c')

As a general rule, you should indeed run the same OS version
for the primary and physical replicas.
Before Postgres version 15 this message did not exist, so the risks
of mismatch were silent but they existed just the same.

Best regards,
-- 
Daniel Vérité 
https://postgresql.verite.pro/