Особенности обновления, связанные с переходом на ядро 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содержит утилиту расчета хеш-суммы в формате ядра PostgreSQLpsql_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). Это необходимо также учитывать при ручном обновлении с переносом данных. Добавлен новый шаг после установки серверной части СУБД:
-
(master, replica) Распакуйте архив
extensions.tar.gz:tar -xzf ~/pangolin/extensions/extensions.tar.gz -C ~/pangolin/extensions/ -
(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 по умолчанию будет включена опция BUFFERS | — | EXPLAIN ANALYZE (BUFFERS FALSE) |
initdb без опций создает кластер с контрольными суммами | — | initdb --no-data-checksums |
Ограничения больше не копируются в секцию, отсоединяемую DETACH PARTITION CONCURRENTLY от таблицы, партиционированной по хешу (с 18.1 Ссылка на изменение) | Последующий ATTACH этой таблицы будет включать последовательное сканирование | Добавить такие же независимые ограничения вручную |