Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Managed Service for PostgreSQL
  • Начало работы
    • Все руководства
    • Создание кластера PostgreSQL для 1С
    • Создание кластера Linux-серверов «1С:Предприятия» с кластером Managed Service for PostgreSQL
    • Выгрузка базы данных в Yandex Data Processing
    • Поиск проблем с производительностью кластера
    • Анализ производительности и оптимизация
    • Настройка подключения из контейнера Serverless Containers
    • Поставка данных в Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Поставка данных в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Поставка данных в Yandex Managed Service for Apache Kafka® с помощью Debezium
    • Захват изменений PostgreSQL и поставка в YDS
    • Поставка данных из Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Перенос данных из Yandex Object Storage с использованием Yandex Data Transfer
    • Настройка отказоустойчивой архитектуры в Yandex Cloud
    • Мониторинг состояния географически распределенных устройств
    • Запись логов балансировщика в PostgreSQL
    • Создание сервера MLFlow для логирования экспериментов и артефактов
    • Работа с данными с помощью Query
    • Федеративные запросы к данным с помощью Query
    • Решение проблем с сортировкой строк после обновления glibc
    • Запись данных с устройства в базу данных
  • Управление доступом
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Публичные материалы
  • История изменений
  • Обучающие курсы

В этой статье:

  • Критичность проблемы
  • Техническое решение
  • Принцип работы
  • Верификация
  • Рекомендации при обновлении Ubuntu до 18.04
  1. Практические руководства
  2. Решение проблем с сортировкой строк после обновления glibc

Решение проблем с сортировкой строк в PostgreSQL после обновления glibc

Статья создана
Yandex Cloud
Обновлена 8 апреля 2025 г.
  • Критичность проблемы
  • Техническое решение
    • Принцип работы
    • Верификация
  • Рекомендации при обновлении Ubuntu до 18.04

Версия библиотеки glibc (GNU C) в Ubuntu 18.04 содержит существенные изменения в правилах сортировки строк. Это изменение влияет на отображение данных и структуру индексов в PostgreSQL, что может привести к нарушению уникальности первичного ключа.

Пример:

CREATE TABLE t (id int, str text PRIMARY KEY);
INSERT INTO t VALUES (1, 'yndkpx'), (2, 'ynd_kpx'), (3, 'ynd-kpx'), (4, 'kpx');

Результат сортировки в выводе SELECT * FROM t ORDER BY str;:

  • На Ubuntu 14.04:

     id |   str
    ----+---------
      1 | yndkpx
      2 | ynd_kpx
      3 | ynd-kpx
      4 | kpx
    
  • На Ubuntu 18.04:

     id |   str
    ----+---------
      3 | ynd-kpx
      2 | ynd_kpx
      1 | yndkpx
      4 | kpx
    

Критичность проблемыКритичность проблемы

Изменение порядка сортировки приводит к следующим последствиям:

  • Нарушение уникальности PRIMARY KEY. PostgreSQL допускает вставку дубликатов:

    INSERT INTO t VALUES (5, 'ynd_kpx');
    INSERT 0 1  -- Операция успешна, что является нарушением
    
  • Некорректная работа индексов:

    Проверка через amcheck:

    CREATE EXTENSION IF NOT EXISTS amcheck;
    SELECT bt_index_check('t_pkey');
    

    Результат:

    ERROR:  item order invariant violated for index "t_pkey"
    DETAIL:  Lower index tid=(1,1) (points to heap tid=(0,1)) higher index tid=(1,2) 
    (points to heap tid=(0,5)) page lsn=0/1665F88.
    
  • Изменение результатов сравнения строк:

    -- Ubuntu 14.04:
    SELECT '1-1' < '11';
    
     ?column? 
    ----------
     f
    
    -- Ubuntu 18.04:
    SELECT '1-1' < '11';
    
     ?column? 
    ----------
     t
    

Техническое решениеТехническое решение

Решение реализовано в виде пакета mdb-locales, включающего:

  • Библиотеку libmdblocales для загрузки локалей.
  • Патч для PostgreSQL.
  • Фиксированные локали из предыдущей версии glibc.

Принцип работыПринцип работы

mdb-locales обеспечивает перехват системных вызовов локалей с их переадресацией в библиотеку, что стабилизирует поведение сортировки:

-- После установки mdb-locales:
SELECT * FROM pg_collation WHERE collprovider='c';

Результат:

  oid  |  collname  | collnamespace | collowner | collversion
-------+------------+---------------+-----------+-------------
 12547 | en_US.utf8 |            11 |        10 | 2.27
 12548 | en_US      |            11 |        10 | 2.27

ВерификацияВерификация

Проверка корректности работы после установки mdb-locales:

-- Проверка уникальности PRIMARY KEY
INSERT INTO t VALUES (5, 'ynd_kpx');

ERROR:  duplicate key value violates unique constraint "t_pkey"

-- Проверка целостности индекса
SELECT bt_index_check('t_pkey');

 bt_index_check 
---------------
               
(1 row)

Рекомендации при обновлении Ubuntu до 18.04Рекомендации при обновлении Ubuntu до 18.04

  1. Перед обновлением:

    • Создайте полную резервную копию данных.
    • Проведите аудит индексов.
    • Установите и настройте mdb-locales.
  2. После обновления:

    • Выполните проверки индексов через amcheck.
    • Протестируйте критичные запросы с сортировкой.
    • Верифицируйте уникальные ограничения.

Важно

Обновление glibc может нарушить фундаментальные гарантии базы данных. Необходимо провести полное тестирование после обновления системы.

Была ли статья полезна?

Предыдущая
Федеративные запросы к данным с помощью Query
Следующая
Запись данных с устройства в базу данных
Проект Яндекса
© 2025 ООО «Яндекс.Облако»