Перейти к основному содержимому

Особенности обновления, связанные с переходом на ядро PostgreSQL 18.3

Внимание!

Обновление с установленным расширением TimescaleDB (TSL) недоступно.

Изменения состава дистрибутива в Pangolin 8.1.x

Отдельные RPM-пакеты для oracle_fdw и tds_fdw

Расширения oracle_fdw и tds_fdw выделены в отдельные RPM-пакеты с явным указанием всех необходимых зависимостей.

Наименование пакетов rpm/deb-пакетов расширений oracle_fdw и tds_fdw и их версионирование:

pangolin-dbms-{base_version}-oracle-fdw-{product_version}-{OS}.x86_64.rpm
pangolin-dbms-{base_version}-tds-fdw-{product_version}-{OS}.x86_64.rpm
  • {OS} – наименование операционной системы и ее версия;
  • {product_version} – версия продукта (текущая версия: 8.2.0);
  • {base_version} – базовая версия продукта (текущая: 8).

Версии rpm/deb-пакетов расширений соответствую версии продукта. Файлы расширений по-прежнему размещаются в каталоге серверной части СУБД /opt/pangolin-dbms-server. Пакеты расширений в поставляемом дистрибутиве располагаются в отдельном extensions-distrib.zip файле:

...
├── documentation-distrib.zip
├── extensions-distrib.zip
├── installer-distrib.zip
├── owned-distrib.zip
...

После распаковки дистрибутива с помощью unpacker-distrib пакеты будут находиться в корневом каталоге extensions:

...
├── 3rdparty
├── documentation
└── extensions
├── installer-distrib.zip
└── pangolin-dbms-{base_version}-oracle-fdw_{product_version}_{OS}.deb
└── pangolin-dbms-{base_version}-tds-fdw_{product_version}_{OS}.deb
...

В процессе сборки rpm/deb-пакетов включается автоматический сбор всех runtime-зависимостей на этапе компиляции. Это позволяет гарантировать работоспособность расширений на целевых системах без необходимости дополнительной ручной установки пакетов. Права на каталоги и файлы остались прежними.

Новые rpm/deb-пакеты

Добавились rpm/deb-пакеты:

  • пакет pangolin-license-verify содержит утилиту осуществляющую проверку ранее подписанной лицензии psql_rsa_verify с явным указанием всех необходимых зависимостей;
  • пакет pangolin-secret-storage-client содержит утилиту secret_storage_client проверки готовности защищенного хранилища VAULT к последующему обновлению secret_storage_client;
  • пакет pangolin-password-hash содержит утилиту расчета хеш-суммы в формате ядра PostgreSQL psql_get_password_hash, переименованную в pangolin_password_hash.

После распаковки дистрибутива с помощью unpacker-distrib пакеты будут находиться в корневом каталоге utilities:

...
├── untrusted
└── utilities
...
├── pangolin-license-verify-{product_version}-{OS}.rpm
├── pangolin-password-hash-{product_version}-{OS}.rpm
└── pangolin-secret-storage-client-{product_version}-{OS}.rpm
...

Изменения путей

Изменились стандартные каталоги PGDATA/PGHOME/расположение расширений, которые в своем наименовании используют мажорную версию продукта. Например: /opt/pangolin-dbms-server-7 поменялся на /opt/pangolin-dbms-server-8.

Изменения в автоматизированных сценариях обновления Pangolin 8.1.x

Изменения касаются добавления нового шага в сценарий обновления СУБД Pangolin с переносом данных, а также в сценарий разведки перед таким обновлением. Теперь перед запуском самого процесса обновления или разведки, а именно в предварительной подготовке стенда, устанавливаются rpm/deb-пакеты данных расширений, если в исходной СУБД они были зарегистрированы (CREATE EXTENSIONS). Это необходимо также учитывать при ручном обновлении с переносом данных. Добавлен новый шаг после установки серверной части СУБД:

  1. (master, replica) Распакуйте архив extensions.tar.gz:

    tar -xzf ~/pangolin/extensions/extensions.tar.gz -C ~/pangolin/extensions/
  2. (master, replica) Произведите обновление пакетов расширений:

    export PANGOLIN_DBMS_MAJOR=x
    export PANGOLIN_VER=x.x.x
    sudo dnf install -y ~/pangolin/extensions/pangolin-dbms-$PANGOLIN_DBMS_MAJOR-{ext_name}-$PANGOLIN_VER-{OS}.rpm

    Где ext_name - название расширения.

Изменения в автоматизированных сценариях установки Pangolin

Поддержка шифров ssl_tls13_ciphers

Комплектов шифров, которые могут применяться для соединений с использованием TLS версии 1.3 можно задать через пользовательский конфигурационный файл с помощью параметра ssl_tls13_ciphers. Несколько комплектов можно указать в строке, разделяя двоеточиями. Если значение не задано, используется комплект шифров OpenSSL по умолчанию.

Перед началом установки выполняется проверка допустимых значений шифров. Список поддерживаемых шифров определяется с помощью команды:

openssl ciphers -tls1_3

Если задано значение, отсутствующее в этом списке, будет выведено ERROR-сообщение:

"FAIL__E01052:Значение {} для параметра {} не поддерживается. Замените значение параметра в пользовательском конфигурационном файле на допустимое. Список поддерживаемых шифров: {}.FAIL"

Чтобы включить использование шифров, которые могут применяться для соединений с использованием TLS версии 1.3 необходимо одновременно с этим задать значение 'TLSv1.3' в пользовательском конфигурационном файле для параметра ssl_min_protocol_version. Иначе будет выведено ERROR-сообщение:

"FAIL__E01053:Значение параметра ssl_min_protocol_version в пользовательском конфигурационном файле несовместимо с параметром ssl_tls13_ciphers. Очистите значение ssl_tls13_ciphers или укажите совместимое значение 'TLSv1.3' для ssl_min_protocol_version.FAIL"

Изменения в скриптах обновления и процессе обновления Pangolin

Обновление со сторонними расширениями

Изменено название параметра, определяющего путь поиска управляющих файлов расширений (имя .control). Теперь вместо alternative_extension_control_directory используется его ванильный аналог — extension_control_path. Новый параметр требует иного формата задания пути. Новый параметр extension_control_path должен содержать список абсолютных путей к директориям, разделенных символом двоеточия :. Например:

extension_control_path = '/usr/local/share/postgresql:/home/my_project/share:$system'

По умолчанию значением является переменная $system. Если оставить этот параметр пустым, автоматически применяется значение по умолчанию — $system.

Эти изменения будут отображены в WARNING-сообщении сценария разведки:

"WARNING__W03021:Параметр GUC, определяющий путь хранения файлов управления расширениями (.control), был переименован с alternative_extension_control_directory на extension_control_path.WARNING"

Проверка хеш пароля пользователей в MD5

Шифрование паролей алгоритмом MD5 перестанет поддерживаться в следующей основной версии. Команды CREATE ROLE и ALTER ROLE теперь выводят предупреждение об устаревании при установлении параметров паролей MD5. Эти предупреждения можно отключить, установив значение off для параметра md5_password_warnings. Рекомендуется перевести их на аутентификацию по хешу SCRAM-SHA-256, потому что алгоритм хеширования MD5 больше не может считаться безопасным и в следующих версиях сервера может устареть. В скрипте-разведчике будет добавлена проверка наличия пользователей с хеш пароля в MD5 и выводиться WARNING-сообщение.

Способ проверки:

SELECT rolname FROM pg_catalog.pg_authid WHERE rolpassword LIKE 'md5%';

WARNING-сообщение:

"WARNING__W03025:Использование MD5 для шифрования паролей устарело. Перейдите на SCRAM-SHA-256 для повышения безопасности для следующих пользователей: {}.WARNING"

Проверка индексов BRIN на наличие ошибок расчета расстояний в операторе numeric_minmax_multi_ops

Проблема заключается в некорректном расчете расстояний в опорной функции BRIN numeric_minmax_multi_ops. Ошибка проявляется следующим образом:

  • На 64-битных системах расчет неверен лишь эпизодически.
  • На 32-битных архитектурах ошибка возникает гораздо чаще.

Хотя эта проблема не вызывает явных сбоев системы, неправильный расчет может привести к увеличению размера индекса (BRIN) и снижению производительности запросов. Рекомендуется провести повторное построение индексов, использующих этот оператор, чтобы избежать потенциального ухудшения эффективности.

Способ проверки:

SELECT current_database() as dbname, n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, CASE c.relispartition WHEN false THEN format('REINDEX INDEX %1I.%2I;', n.nspname, i.relname) ELSE null END fix_command FROM pg_index x JOIN pg_class c ON c.oid = x.indrelid JOIN pg_class i ON i.oid = x.indexrelid JOIN pg_am am ON i.relam = am.oid LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE (c.relkind = ANY (ARRAY['r'::"char", 'm'::"char", 'p'::"char"])) AND (i.relkind = ANY (ARRAY['i'::"char", 'I'::"char", 'G'::"char"])) AND am.amname = 'brin' AND x.indclass::oid[] && ARRAY(SELECT oid FROM pg_opclass WHERE opcname = 'numeric_minmax_multi_ops' AND opcmethod = am.oid);

WARNING-сообщение:

"WARNING__W03026:В базе(ах) {} обнаружены индексы BRIN. Индекс BRIN, созданный с использованием оператора numeric_minmax_multi_ops может содержать поврежденные данные из-за ошибки расчета расстояний. Для улучшения производительности и стабильности рекомендуется выполнить перестройку затронутых индексов командой REINDEX перед началом обновления.WARNING"

Конфликт имен ролей

Описание проверки:

Обнаружена пользовательская роль с именем, совпадающим с именем системной роли pg_signal_autovacuum_worker. В процессе проверки перед обновлением будет выведено сообщение о конфликте имен ролей. Для продолжения обновления потребуется предварительно удалить пользовательскую роль.

Текст сообщения:

FAIL__E03124: Обнаружена роль pg_signal_autovacuum_worker, конфликтующая с одноименной системной ролью: {}. Для продолжения обновления пользовательская роль должна быть предварительно удалена.FAIL

Зависимости от удаленных атрибутов

Описание проверки:

В базе данных найдены представления, которые ссылаются на атрибуты системного каталога, удаленные в новой версии СУБД Pangolin 8.x.x. Будет выведено сообщение с перечнем удаленных атрибутов и требованием устранить зависимости от них перед обновлением.

Текст сообщения:

FAIL__E03125: Обнаружены представления, ссылающиеся на удаляемые элементы системного каталога: {}. В СУБД Pangolin версии 8.x.x следующие атрибуты были удалены: pg_catalog.pg_backend_memory_contexts.parent, pg_catalog.pg_attribute.attcacheoff, pg_catalog.pg_stat_wal.wal_write, pg_catalog.pg_stat_wal.wal_sync, pg_catalog.pg_stat_wal.wal_write_time, pg_catalog.pg_stat_wal.wal_sync_time.FAIL

Запрет UNLOGGED-таблиц

Описание проверки:

Попытка создания UNLOGGED-партиционированной таблицы, что более не допускается в новой версии СУБД. Будет выведено сообщение о запрете создания таких таблиц.

Текст сообщения:

FAIL__E03126: Создание UNLOGGED партиционированных таблиц более не допускается: {}.FAIL

Расхождение параметров сортировки

Описание проверки:

В системных базах данных template0, template1, postgres не совпадают параметры сортировки и локали. Будет выведено сообщение о необходимости привести параметры к единому значению.

Текст сообщения:

FAIL__E03127: Для баз template0, template1 и postgres обнаружены расхождения правил сортировки и локали. Необходимо привести их к единому значению.FAIL

Смешение логирования в секциях

Описание проверки:

Обнаружены партиционированные таблицы, содержащие секции с разной стратегией логирования (смешаны LOGGED и UNLOGGED). Будет выведено предупреждение о нежелательности такого смешения.

Текст сообщения:

WARNING__W03027: Обнаружены партиционированные таблицы, содержащие UNLOGGED секции: {}. Смешение стратегии логирования данных в пределах партиционированных таблиц нежелательно.WARNING

Индексы pg_trgm и правила сортировки

Описание проверки:

Найдены индексы, связанные с расширением pg_trgm и полнотекстовым поиском. В новой версии изменены правила сортировки. Будет выведено предупреждение с рекомендацией перестроить эти индексы после завершения обновления.

Текст сообщения:

WARNING__W03028: В базе(ах) {} обнаружены индексы, связанные с полнотекстовым поиском и pg_trgm. В новой версии СУБД Pangolin изменено определение правил сортировки в расширении pg_trgm. Рекомендуется после завершения обновления перестроить индексы, связанные с полнотекстовым поиском и pg_trgm.WARNING

Особенности миграции, связанные с переходом на ядро оригинального PostgreSQL 18.3

ИзменениеОписание
Переход на 18 версию с любой из предыдущих предполагает перенос данных через pg_dumpall или логическую репликацию, либо мажорное обновление через pg_upgrade
Изменение поведения initdb, чтобы по умолчанию включить расчет контрольных сумм данных (Грег Сабино Маллейн)

Ссылка на изменение
Расчет контрольных сумм можно отключить при помощи нового параметра конфигурации initdb --no-data-checksums. Он может быть полезен при обновлении старых кластеров без включенного расчета контрольных сумм, для этого pg_upgrade требует, чтобы параметры контрольных сумм кластеров совпадали
Изменение обработки аббревиатур часовых поясов (Том Лейн)

Ссылка на изменение
Теперь система проверяет аббревиатуры часовых поясов текущего сеанса до проверки параметра конфигурации timezone_abbreviations. Ранее он проверялся первым
Объявление устаревшей аутентификации по паролю, зашифрованному алгоритмом MD5 (Натан Боссарт)

Ссылка на изменение
Шифрование паролей алгоритмом MD5 перестанет поддерживаться в следующей основной версии. Команды CREATE ROLE и ALTER ROLE теперь выводят предупреждение об устаревании при установлении параметров паролей MD5. Эти предупреждения можно отключить, установив значение off для параметра md5_password_warnings
Изменение обработки потомков родительской таблицы командами VACUUM и ANALYZE (Майкл Харрис)

Ссылка на изменение
Предыдущее поведение можно включить при помощи нового параметра ONLY
Запрет COPY FROM обрабатывать \. как маркер конца файла при чтении файлов CSV (Даниэль Верите, Том Лейн)

Ссылка на изменение

Ссылка на изменение
psql все еще обрабатывает \. как маркер конца файла при чтении файлов CSV из STDIN. Старые клиенты psql, подключающиеся к серверам PostgreSQL 18, могут сталкиваться с проблемами \copy. Кроме того, в этом выпуске проверяется размещение \. отдельно на новой строке
Запрет нежурналируемых партиционированных таблиц (Микаэль Пакье)

Ссылка на изменение
Ранее команда ALTER TABLE SET [UN]LOGGED не делала ничего, и при создании нежурналируемой партиционированной таблицы ее потомки все равно оставались журналируемыми
Выполнение триггеров AFTER от имени роли, которая была активна при постановке триггеров в очередь (Лауренц Альбе)

Ссылка на изменение
Ранее такие триггеры срабатывали от имени роли, которая была активна на момент выполнения триггера (например, при выполнении команды COMMIT). Это важное изменение для случаев, когда роль меняется в момент между постановкой триггера в очередь и фиксацией транзакции
Прекращение поддержки неработающих прав RULE в GRANT / REVOKE (Фудзии Масао)

Ссылка на изменение
Они не работают, начиная с PostgreSQL 8.2
Удаление столбца pg_backend_memory_contexts.parent (Мелих Мутлу)

Ссылка на изменение
После добавления столбца pg_backend_memory_contexts.path он стал ненужным
Изменение принципа нумерации pg_backend_memory_contexts.level и pg_log_backend_memory_contexts(), которая теперь начинается с 1 (Мелих Мутлу, Атсуши Торикоши, Дэвид Роули, Фудзии Масао)

Ссылка на изменение

Ссылка на изменение

Ссылка на изменение
Ранее нумерация начиналась с нуля
Использование провайдера правил сортировки по умолчанию вместо libc для полнотекстового поиска при чтении файлов конфигурации и словарей (Питер Эйзентраут)

Ссылка на изменение
Кластеры, по умолчанию использующие отличный от libc провайдер правил сортировки (например, ICU, builtin), поведение которого отличается от поведения libc в части обработки символов параметром LC_CTYPE, могут столкнуться с изменением поведения модуля pg_trgm и некоторых функций полнотекстового поиска. При обновлении таких кластеров при помощи pg_upgrade рекомендуется перестроить все индексы, связанные с полнотекстовым поиском и pg_trgm, после завершения обновления
При обновлении может потребоваться ручное изменение файлов конфигурацииПараметр alternative_extension_control_directory необходимо закомментировать. Сконфигурировать параметр extension_control_path, перенеся значения из alternative_extension_control_directory, заменив разделитель , на : и убрав суффикс /extension из всех путей. Также необходимо добавить путь поиска .control-файлов по умолчанию в виде макроса $system или абсолютного пути

Устаревшие объекты и функции сервера, изменения поведения оригинального PostgreSQL 18.3

ИзменениеЧто недоступноЧем заменить
По умолчанию initdb включает контрольные суммы (data checksums)

Ссылка на изменение
Создание кластера баз без контрольных сумм при отсутствии опцийИспользовать новую опцию --no-data-checksums. Не рекомендуется!
Если название часового пояса есть в активной timezone сессии, то к вводимым значениям datetime будут применены правила из активной timezone

Ссылка на изменение
В этом случае больше не применится описание часового пояса из timezone_abbreviations, даже если оно там естьПерекрыть правила timezone сессии больше не получится. Можно только увидеть в представлении pg_timezone_abbrevs, что применились именно они
Хеш MD5 для паролей признан устаревшим, CREATE ROLE и ALTER ROLE теперь выдают предупреждения вида MD5 password support is deprecated and will be removed in a future release of PostgreSQL.

Ссылка на изменение
В следующих версиях алгоритм MD5 будет удаленПерейти на SCRAM-SHA-256.
На время перехода можно установить md5_password_warnings = off, чтобы избавиться от предупреждений. Но перейти все равно придется
Команды VACUUM и ANALYZE на родительской таблице теперь по умолчанию включают обработку таблиц-наследниковЧтобы выполнять команды «как раньше» (без обработки потомков), можно использовать новый ключ ONLY:
ANALYZE ONLY only_inh_parent;
VACUUM ONLY only_inh_parent;
Для партиционированных таблиц поведение не изменилось, так как их обработка и раньше включала секции. Здесь ANALYZE ONLY применима, а вот VACUUM ONLY ничего не делает
COPY FROM больше не считает \. концом файла при чтении файла CSV

Ссылка на изменение

Ссылка на изменение
Старое поведение сохранено для совместимости при чтении STDIN и в psql
Загрузка файла CSV с окончанием \. на сервереСогласно RFC 4180, файл специально завершать не нужно. Последняя строка может (необязательно) завершаться CRLF
Запрещено объявлять партиционированные таблицы нежурналируемыми

Ссылка на изменение
Команды:
ALTER TABLE SET [UN]LOGGED;
CREATE UNLOGGED TABLE;
теперь возвращают ошибку partitioned tables cannot be unlogged.
- pg_dump и pgbench тоже исправили
Две команды, которые и раньше не работали — в результате секции все равно оставались/добавлялись журналируемыми
Отложенные триггеры (AFTER) выполняются от роли, которая была активной на момент срабатывания триггера, а не от роли, активной на момент проверки (COMMIT)

Ссылка на изменение
Выполнение отложенного триггера от новой роли, включенной между срабатыванием триггера и COMMITЕсли это важно, перевести функцию триггера на SECURITY DEFINER
В GRANT/REVOKE и функциях has_table_privilege() удалена привилегия RULE, которая была неактивна с PG 8.2

Ссылка на изменение
В pg_backend_memory_contexts убрали поле parent

Ссылка на изменение
Наименования контекстов в общем случае не уникальны, поэтому запросы по иерархии сбоили
Запросы и объекты pg_backend_memory_contexts.parent придется убрать из мониторингов, если естьИспользовать новое поле pg_backend_memory_contexts.path
В pg_backend_memory_contexts нумерация уровней level теперь начинается с 1

Ссылка на изменение

Ссылка на изменение

Ссылка на изменение
Функция pg_log_backend_memory_contexts() исправлена соответственно
Уровня 0 больше нетИспользовать массив path. Новая нумерация позволяет обходить его, не запутываясь в идентификаторах: path[level] — заданный уровень дерева контекстов. Идентификаторы на уровне раздаются обходом в порядке прохода поиска в ширину (алгоритм BFS). Контексты ниже TopLevelMemoryContext нестабильны, но близкие к нему верхние уровни с меньшей вероятностью изменяются между запросами и во время выполнения запросов
Из pg_stat_wal перенесены в pg_stat_io поля

Ссылка на изменение

Ссылка на изменение:
wal_write, wal_sync, wal_write_time и wal_sync_time
Поля pg_stat_wal.wal_write, pg_stat_wal.wal_sync, pg_stat_wal.wal_write_time, pg_stat_wal.wal_sync_timeИспользовать соответствующие поля pg_stat_io
Удалено поле pg_attribute.attcacheoff

Ссылка на изменение
Поле pg_attribute.attcacheoffВ этом поле СУБД всегда сохраняла на диске -1, а в памяти (в дескрипторе записи) оно использовалось как место для кэширования смещения атрибута в записи.
- Запросы, представления: убрать поле.
- Внутренний код: пользоваться новой структурой CompactAttribute
Полнотекстовый поиск (to_tsvector, to_tsquery, pg_trgm, .. ) теперь пользуется той библиотекой-провайдером локалей, которая задана в системе. Если это ICU или builtin — они и будут использоваться

Ссылка на изменение
Больше нет фиксированного использования libc в полнотекстовом поискеПользоваться выбранной для кластера библиотекой.
Если библиотека отличается от libc — рекомендуется перестроить все индексы, связанные с полнотекстовым поиском и pg_trgm, после завершения обновления
Смена названия параметра ssl_ecdh_curve на ssl_groups
Старое название параметра еще работает для совместимости.
Пользоваться параметром ssl_groups, в котором можно указывать несколько эллиптических кривых, ECDH
В EXPLAIN ANALYZE по умолчанию будет включена опция BUFFERSEXPLAIN ANALYZE (BUFFERS FALSE)
initdb без опций создает кластер с контрольными суммамиinitdb --no-data-checksums
Ограничения больше не копируются в секцию, отсоединяемую DETACH PARTITION CONCURRENTLY от таблицы, партиционированной по хешу (с 18.1

Ссылка на изменение)
Последующий ATTACH этой таблицы будет включать последовательное сканированиеДобавить такие же независимые ограничения вручную