PostgreSQL: локаль кластера не совпадает с системой
PostgreSQL хранит правила сортировки, зависящие от системной библиотеки локалей. После обновления системы версия библиотеки меняется, и база предупреждает о возможной порче индексов, а иногда отказывается работать с базой данных.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Обновилась библиотека локалей
Правила сортировки изменились. Индексы, построенные по прежним правилам, могут давать неверные результаты поиска.
-
Локаль кластера отсутствует в системе
Кластер создан с локалью, которой в системе нет — например после переноса на минимальный образ.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Локали баз и записанные версии правил сортировки.
sudo -u postgres psql -c 'SELECT datname, datcollate, datcollversion FROM pg_database;' 2>/dev/nullПредупреждения о несовпадении версий.
sudo tail -30 /var/log/postgresql/postgresql-16-main.log | grep -i collationРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Правила сортировки изменились. Индексы, построенные по прежним правилам, могут давать неверные результаты поиска.
- Как проверить
-
Посмотрите предупреждения базы и версии правил.
sudo -u postgres psql -c 'SELECT datname, datcollversion FROM pg_database;' 2>/dev/null sudo tail -20 /var/log/postgresql/postgresql-16-main.log | grep -i collation
- Как исправить
- Перестройте индексы и обновите записанную версию правил командой обновления сортировки. Игнорировать предупреждение опасно: поиск может молча возвращать не то.
- Почему происходит
- Кластер создан с локалью, которой в системе нет — например после переноса на минимальный образ.
- Как проверить
-
Сравните локаль кластера и доступные локали.
sudo -u postgres psql -c 'SHOW lc_collate;' 2>/dev/null locale -a | head
- Как исправить
- Создайте нужную локаль в системе. Менять локаль существующего кластера нельзя: это делается только пересозданием.
Пример вывода
После обновления системы изменились правила сортировки. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
postgres[5300]: WARNING: database "shop" has a collation version mismatch
postgres[5300]: DETAIL: The database was created using collation version 2.36, but the operating system provides version 2.39.
postgres[5300]: HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE shop REFRESH COLLATION VERSION.
Связанные ошибки
- Служба падает из-за локали Ошибки вида cannot change locale или искажение кириллицы: у службы другое окружение локали.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- PostgreSQL: could not bind IPv4 address Кластер PostgreSQL не занимает порт: адрес занят другим экземпляром или остался файл сокета. Разбор.
- PostgreSQL: data directory has invalid permissions Кластер PostgreSQL не запускается из-за прав на каталог данных. Требование 0700 или 0750 и как вернуть владельца.
- PostgreSQL: too many clients already База отказывает в подключениях: исчерпан max_connections. Как считать значение и зачем пул соединений.
- PostgreSQL: долгий запуск и таймаут восстановления Кластер восстанавливается после аварийного завершения дольше таймаута systemd. Как правильно увеличить TimeoutStartSec.
- PostgreSQL: нет места под журнал предзаписи База останавливается из-за заполненного каталога журнала предзаписи: неработающая архивация, слот репликации, недостаточный раздел.
- postgresql.service активен, а кластер не работает Обёртка postgresql.service — пустой oneshot. Почему её состояние ничего не говорит о кластере и что смотреть.
Где встречается чаще всего
Источники
- Документация PostgreSQL: правила сортировки
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Наблюдалось после обновления библиотеки локалей на тестовой машине.