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

Проверка готовности к обновлению

Данный раздел описывает процесс проверки готовности экземпляра СУБД Pangolin к обновлению.

Выполнение проверки готовности к обновлению доступно ручным и автоматизированным способом:

  • Автоматизированная проверка перед обновлением обусловлена обязательным запуском утилиты разведчика, в задачи которого входит выполнение ряда проверок, сбора информации о стенде, а также вычислении типа обновления версии СУБД, необходимого для перехода на новую версию СУБД Pangolin. Все проверки происходит автоматически. В результате проверок могут быть либо выведены предупреждения, и дальнейшее обновление может быть продолжено, либо выведены ошибки, и дальнейшее обновление будет заблокировано. Со всеми возможными проверками, предупреждениями и ошибками можно ознакомиться в разделах далее.
  • Ручная проверка перед обновлением обусловлена ручным проведением необходимых проверок с помощью представленных рекомендаций в данном разделе. Является обязательным шагом для предотвращения возникновения возможных трудностей непосредственно в процессе обновления.

Подготовительные действия

Отключение сторонних систем резервного копирования

Перед запуском обновления настоятельно рекомендуется отключить все сторонние системы резервного копирования, не входящие в состав дистрибутива Pangolin.

Разблокировка пользователя postgres

Проверки начинаются с разблокировки пользователя postgres в OC и выставления бессрочного пароля на время работы скрипта.

Действия производятся автоматически при работе скрипта-разведчика.

Загрузка custom_file_sample.yml и словаря update.yml

Происходит загрузка custom_file_sample.yml и словаря update.yml, содержащего дополнительные переменные с информацией для выводимых сообщений и поддерживаемых расширений. Загрузка происходит в автоматическом режиме при использовании скрипта.

Запуск автоматизированной проверки готовности к обновлению

Сведения

Раздел описывает ручной запуск разведчика для автоматизированной проверки готовности к обновлению.

Пропустите данный шаг при необходимости перехода сразу к сценарию автоматизированного обновления при помощи инструмента Pangolin Installer, так как запуск разведчика будет выполнен автоматически.

В случае реализации ручной проверки выполните ознакомления с дальнейшими пунктами «Ручной проверки» в разделах подходящих под реализуемый сценарий.

Обязательным условием запуска скриптов обновления СУБД, является запуск утилиты разведчика (scouting).

  1. Скачайте и распакуйте дистрибутив новой версии на сервере.

  2. Разархивируйте rpm/deb-пакет venv из папки 3rdparty архива дистрибутива:

    tar -xz -f 3rdparty/3rdparty.tar.gz ./pangolin-installer-venv-controller*
  3. Выполните установку пакета:

    sudo dnf install pangolin-installer-venv-controller-{product_version}-{OS}.x86_64.rpm
    Подсказка

    Пример готовой команды:

    sudo dnf -y install pangolin-installer-venv-controller-8.2.0-sberlinux9.x86_64.rpm
  4. Активируйте виртуальное окружение для начала последующей установки:

    source /opt/pangolin-installer/bin/activate
  5. Заполните настраиваемый конфигурационный файл config.yml.

  6. При необходимости в настраиваемом конфигурационном файле заполните список разрешенных файловых систем с помощью параметра allowed_fs. В случае, если данный параметр не будет заполнен для проверки корректности файловых систем для каталогов, будет использоваться значение по умолчанию allowed_fs=['ext4'].

  7. Запустите проверку. Примеры команд для запуска разведчика:

    pangolin-installer terminal -c <path_to_config>/config.yml -a scouting

    Где <path_to_config> - полный путь к конфигурационному файлу config.yml.

Необходимые проверки перед обновлением

В данном разделе представлены проверки, которые производятся в автоматическом режиме скриптом-разведчиком, а также описание проверок для проведения их в ручном режиме.

Проверки делятся на три группы:

Проверки для всех типов обновления

Проверка доступности пакетов продукта

Выполняется проверка всех пакетов СУБД Pangolin. В случае если какой-либо пакет не будет доступен к установке выводится следующая ошибка:

FAIL__E01001:RPM/DEB пакет с версией '{component_version}' компонента '{component_name}' не был найден в 'repo' на хосте {fqdn_host}.FAIL

Где:

  • component_version - версия компонента;
  • component_name - название компонента;
  • fqdn_host - IP-адрес или fqdn узла стенда.

Проверка наличия зависимостей, необходимых для корректной установки пакетов Pangolin

Производится проверка наличия зависимостей, необходимых для корректной установки пакетов Pangolin.

Если зависимости не найдены, будет выведена следующая ошибка:

FAIL__E01051:Не удалось найти зависимость {requirement}, для корректной установки пакетов Pangolin.FAIL

Где:

  • requirement – отсутствующая зависимость для установки пакетов Pangolin.

Проверка поддерживаемых ОС и их версий

Производится проверка типа и версии ОС стенда.

Если СУБД установлена на ОС и/или версии ОС, которая более не поддерживается, будут выведены следующие ошибки:

FAIL__E01006:Текущая ОС {current_os} не поддерживается.
Список поддерживаемых ОС: {list_of_os}.FAIL

FAIL__E01007:Используемый дистрибутив {current_distribution} версия: {current_distribution_version}.
Поддерживаемый дистрибутив {current_distribution}: с версии {min_required_os} до {max_required_os}.FAIL

Где:

  • current_os – ОС на узле стенда;
  • list_of_os – список поддерживаемых ОС;
  • current_distribution – название установленного на узле дистрибутива;
  • current_distribution_version – версия установленного на узле дистрибутива;
  • min_required_os – минимальная версия поддерживаемого дистрибутива;
  • max_required_os – максимальная версия поддерживаемого дистрибутива.

Проверки сетевых имен для узлов стенда

Данные проверки осуществляются, если стенд был настроен с помощью FQDN узлов и был включен параметр used_fqdn_host. По умолчанию данный параметр включен.

  1. Производится проверка доступности узлов по сетевому имени. Проверка осуществляет опрос DNS сервера на предмет получения IP-адресов для сетевых имен узлов стенда. Если данная проверка не пройдена, то будет выведена следующая ошибка:

    FAIL__E01043:В кандидате на обновление для хоста {} был определен следующий fqdn {}.
    Данный fqdn не прошел проверку доступности.
    Такое может быть, когда некорректно настроен DNS-сервер или указано некорректное DNS имя для хоста в /etc/hosts.FAIL
  2. Производится проверка соответствия IP-адреса, полученного от DNS сервера и IP-адреса, указанного на узле. В случае неудачи данной проверки будет выведена следующая ошибка:

    FAIL__E01046:В кандидате на обновление для хоста {} определен следующий FQDN {}.
    Он не соответствует IP-адресу, полученному с хоста.
    Это может быть связано с некорректной настройкой DNS-сервера или неправильным указанием DNS-имени для хоста в /etc/hosts.FAIL

Проверка файла лицензии

Производится проверка наличия и валидности файла лицензии. Проверка валидности проводится с помощью утилиты psql_rsa_verify.

Если файл лицензии не найден, будет выведена ошибка:

FAIL__E01021:Лицензия, переданная в параметре pangolin_license_path, не найдена.
Для продолжения скорректируйте параметр pangolin_license_path, указав путь до лицензии.FAIL

Если проверка валидности файла лицензии проходит неудачно, будет выведена следующая ошибка:

FAIL__E01022:Переданная лицензия невалидная.
{error_stdout}FAIL

Где error_stdout – вывод результата проверки файла лицензии.

Проверка Machine ID

Производится проверка наличия Machine ID на узлах стенда.

Если проверки не будут пройдены, будут выведены следующие ошибки:

FAIL__E01015:На хосте {inventory_hostname}, не найден файл {path_to_file} или он пустой.
Для продолжения нужно инициализировать данный файл.FAIL

FAIL__E01016:На хосте {inventory_hostname}, содержимое файла /etc/machine_id не имеет hex формат.
Для продолжения нужно переинициализировать данный файл.FAIL

Где:

  • inventory_hostname – имя узла стенда;
  • path_to_file – путь до файла с Machine ID.

Проверка корректности конфигурационного файла

Производится проверка конфигурационного файла postgresql.conf на предмет ошибок заполнения.

Если конфигурационный файл содержит какие-либо ошибки, то выводится сообщение:

FAIL__E03031:В кандидате на обновление для хоста {inventory_hostname}, в конфигурационном файле postgresql.conf обнаружены ошибки заполнения.FAIL

Где inventory_hostname – имя узла стенда.

Проверка поддерживаемой версии для обновления

Производится проверка возможности обновления СУБД с текущей версии, установленной на стенд.

В случае невозможности обновления будет получена ошибка вида:

FAIL__E03017:Обновление невозможно, так как текущая версия ({current_db_version}) не поддерживается.
Минимальная поддерживаемая версия: {min_db_version}.
Рекомендуется обновиться на промежуточную версию.FAIL

Где:

  • current_db_version – версия Pangolin, установленная на стенде;
  • min_db_version – минимально поддерживаемая версия Pangolin для обновления.

Информация о поддерживаемых версиях для обновления содержится в разделе «Таблица поддерживаемых для обновления версий СУБД».

Проверка использования KMS-заменителя

Обновление стендов с включенным KMS-заменителем произвести будет невозможно. В скриптах разведчика организована проверка на случай таких стендов.

Если обнаружено наличие KMS-заменителя, будет выведена следующая ошибка:

FAIL__E03058:Обновление невозможно, так как на стенде обнаружено использование VAULT-заменителя.
Переведите стенд на использование физического VAULT-сервера и повторите запуск скрипта разведчика.FAIL

Проверка пароля postgres_db_pass, передаваемого в пользовательском конфигурационном файле

Производится проверка пароля для доступа к базе, указываемого в параметре postgres_db_pass пользовательского конфигурационного файла. Ожидается, что данный пароль засекречен с помощью Ansible-vault.

В случае ошибки будет получено следующее сообщение:

FAIL__E01017:Переданный пароль от суперпользователя postgres не соответствует ни открытому виду, ни Ansible-хешу.
Требуется передать пароль в открытом виде или в виде Ansible-хеша.
Для продолжения работы необходим пароль.FAIL

Проверка корректной записи хеша пароля суперпользователя postgres во временный файл для корректной инициализации БД

Производится проверка записи хеша пароля суперпользователя postgres во временный файл.

Если записать хеш во временный файл не получается, будет получено сообщение вида:

FAIL__E01018:В процессе формирования хеша для пароля суперпользователя postgres что-то пошло не так.
Пароль не был записан во временный файл '{path_to_tmp_file}'.
Инициализация БД невозможна.
Ознакомьтесь с логами.FAIL

Где path_to_tmp_file – путь до временного файла с паролем.

Проверка наличия конфигурационного файла VAULT

Выполняется поиск конфигурационного файла для подключения к VAULT. При отсутствии файла будет выведено сообщение:

FAIL__E03066:В кандидате на обновление не обнаружен конфигурационный файл '{path_to_config}' для подключения к VAULT.
Проверьте состояния стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.FAIL

Где path_to_config – пути до конфигурационного файла для подключения к VAULT.

Проверка наличия успешного подключения к защищенному хранилищу VAULT

Выполняется попытка подключения к VAULT с помощью утилиты setup_kms_credentials. При невозможности подключиться к VAULT будет выведено сообщение вида:

FAIL__E03067:Не удалось обнаружить ни одного успешного подключения к защищенному(ым) хранилищу(ам) VAULT.
В результате возникли ошибки: {error_stdout}.
Проверьте состояние стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.FAIL

Где error_stdout – вывод ошибки в результате выполнения команды setup_kms_credentials show --plain.

Получение общего списка параметров из защищенного хранилища VAULT

Выполняется попытка получения параметров из защищенного хранилища. В случае возникновения ошибок будет получено сообщение вида:

FAIL__E03060:В процессе получения списка параметров из защищенного хранилища VAULT возникли ошибки: '{error_stdout}'.
Причиной может быть отсутствие конфигурационного файла '{path_to_config}' с параметрами подключения к защищенному хранилищу VAULT.
Произведите проверку состояние подключения к VAULT серверу(ам) и повторите запуск скрипта разведчика.FAIL

Где:

  • error_stdout – вывод ошибки в результате выполнения команды ./secret_storage_client --config;
  • path_to_config – путь до конфигурационного файла для подключения к VAULT.

Проверка корректного значения для параметра secure_config на защищенном хранилище VAULT

Осуществляется проверка состояния параметра secure_config на стенде и в защищенном хранилище.

Если состояние стенда показало, что защита парамтеров конфигурации включена, среди списка параметров из защищенного хранилища ожидается значение secure_config=on, в противном случае будет выведена следующая ошибка:

FAIL__E03061:Значение параметра secure_config в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда.
При включенной защите параметров конфигурации значение для параметра secure_config должно быть 'on' в защищенном хранилище VAULT.
Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT.
Затем повторите запуск скрипта разведчика.FAIL

В случае отключенной защиты конфигурации, в защищенном хранилище значение параметра secure_config должно быть равно off. Если обнаружено несоответствие, то будет выведена следующая ошибка:

FAIL__E03062:Значение параметра secure_config в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда.
При выключенной защите параметров конфигурации значение для параметра secure_config должно быть 'off' в защищенном хранилище VAULT.
Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT.
Затем повторите запуск скрипта разведчика.FAIL

Проверка корректного значения для параметра is_tde_on на защищенном хранилище VAULT

Осуществляется проверка состояния TDE на стенде и в защищенном хранилище.

В случае, когда состояние стенда показало включенное TDE, в защищенном хранилище ожидается значение on/true, в противном случае будет выведена ошибка:

FAIL__E03063:Значение параметра is_tde_on в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда.
При включенном прозрачном защитном преобразовании данных значение для параметра is_tde_on должно быть 'on' в защищенном хранилище VAULT.
Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT.
Затем повторите запуск скрипта разведчика.FAIL

В случае, если TDE выключено, значение параметра is_tde_on в защищенном хранилище будет соответствовать off/false. В случае обнаружения несоответствия, будет выведена следующая ошибка:

FAIL__E03064:Значение параметра is_tde_on в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда.
При выключенном прозрачном защитном преобразовании данных значение для параметра is_tde_on должно быть 'off' на защищенном хранилище VAULT.
Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT.
Затем повторите запуск скрипта разведчика.FAIL

Проверка идентичности значений pg_ident на защищенном хранилище VAULT и в локальном конфигурационном файле

Сравниваются значения pg_ident в защищенном хранилище и локальном конфигурационном файле. Значения параметра в обоих случаях должны быть одинаковыми, в противном будет получено сообщение вида:

FAIL__E03065:Значение параметра pg_ident в защищенном хранилище VAULT должно соответствовать значению в локальном конфигурационном файле '$PGDATA/pg_ident.conf'.
Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT.
Затем повторите запуск скрипта разведчика.FAIL

Проверка типа используемоего хранилища VAULT

В случае использования защищенного хранилища OneKey для обновляемой версии Pangolin 6.5.2 будет выведено предупреждение о невозможности выполнения автоматического отката в процессе обновления:

WARNING__W03031:В случае возникновения ошибки в процессе обновления автоматический откат к исходной версии будет невозможен ввиду использования нестандартной версии утилиты setup_kms_credentials.
Перед запуском обновления рекомендуется дополнительно сохранить утилиту setup_kms_credentials.WARNING

Проверка подключения к базе данных

Осуществляется проверка тестового подключения в БД.

Если подключение к БД завершится неудачей из-за некорректного пароля для пользователя postgres, будет выведена следующая ошибка:

FAIL__E01019:Пароль суперпользователя postgres в хранилище SecMan (системе хранения и управления секретами) не соответствует текущему паролю в базе данных.FAIL

Если подключение к БД завершится неудачей из-за отсутствия некорректного доступа в pg_hba, будет выведена следующая ошибка:

FAIL__E01048:Файл 'pg_hba.conf' не содержит корректной строки для подключения пользователя '{username}' к хосту '{inventory_hostname}' с использованием метода 'scram-sha-256'.__FAIL"

Где:

  • username – имя пользователя, под которым производилось тестовое подключение;
  • inventory_hostname – имя узла стенда.

Если при подключении к БД возникла непредвиденная ошибка, будет выведено следующее сообщение:

FAIL__E01049:При выполнении тестового запроса к хосту '{inventory_hostname}' через порт '{db_port}' c текущими данными для подключения пользователя '{username}' в pg_hba.conf произошла непредвиденная ошибка.
Оригинальный текст ошибки: {error_stdout}.
Устраните проблему и попробуйте снова.FAIL

Где:

  • username – имя пользователя, под которым производилось тестовое подключение;
  • inventory_hostname – имя узла стенда;
  • db_port – порт, к которому производилось подключение;
  • error_stdout – оригинальный текст ошибки подключения.

Проверка наличия записей в cron

Выполняется проверка отсутствия/наличия записей postgres в cron.

Если в файле /etc/cron.allow не удалось найти записи postgres, будет выведена следующая ошибка:

FAIL__E01044:В конфигурационном файле /etc/cron.allow не удалось обнаружить запись postgres.
Для корректной работы скриптов развертывания/обновления необходимо добавить данную запись либо удалить файл.FAIL

Если в файле /etc/cron.deny обнаружена запись postgres, будет выведена следующая ошибка:

FAIL__E01045:В конфигурационном файле /etc/cron.deny была обнаружена запись postgres.
Для корректной работы скриптов развертывания/обновления необходимо удалить данную запись.FAIL

Проверка наличия задержки между узлами

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

Если задержка между мастером и репликой будет превышать допустимое значение, установленное в кастомном конфигурационном файле (по умолчанию данное значение равно 100 мб), то будет выведена ошибка:

FAIL__E03082:В кандидате на обновление обнаружен недопустимый объем lag: {current_lag}.
Для продолжения обновления нужно синхронизировать кластер до максимального объема lag {max_lag}.FAIL

Где:

  • current_lag – текущая задержка между мастером и репликой;
  • max_lag – пороговое значение задержки.

Проверка прослушивания портов

Выполняется проверка того, что сервисы обновляемого стенда прослушивают необходимые порты на узле.

Если проверка закончится неудачей, будет выведена следующая ошибка:

FAIL__E03106:Сервис {service_name} не прослушивает ни один из портов.
Проверьте состояние сервиса или настройки конфигурационного файла.FAIL

Где service_name – имя службы.

Проверка состояния параметра KillUserProcesses в файле /etc/systemd/logind.conf

Выполняется проверка состояния параметра KillUserProcesses в файле /etc/systemd/logind.conf.

Если параметр KillUserProcesses в файле /etc/systemd/logind.conf находится в положении yes, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E01003:На хосте host_name в файле /etc/systemd/logind.conf включен параметр KillUserProcesses=yes.
Для дальнейшей работы требуется переключить данный параметр в положение KillUserProcesses=no и перезапустить хост.FAIL

Проверка отсутствия неудачных попыток обновления

Скрипт осуществляет проверку предыдущих обновлений и фиксирует неудачные попытки.

Если предыдущие попытки обновления были неуспешными, либо, если при неудачном обновлении был некорректно произведен автоматический откат, то скрипт прервется и создаст файл /home/postgres/.update_pgse/update_disallowed. Пользователю будет выведено сообщение:

FAIL__E03021:Зафиксирована неудачная попытка обновления версии СУБД Pangolin.
В ручном режиме восстановите полностью состояние кластера предыдущей/исходной версии СУБД Pangolin и удалите файл {path_to_file}.FAIL

Где path_to_file – полный путь до файла update_disallowed.

В этом случае необходимо вручную откатить стенд на исходное состояние (подробнее смотрите раздел «Откат»), удалить файл /home/postgres/.update_pgse/update_disallowed, а затем перезапустить разведку.

Проверка включения полного внутреннего резервного копирования данных

Проверяется значение параметра is_inner_full_backup.

Если параметр имеет значение false, то выводится информационное сообщение:

WARNING__W03004:Создание локальной резервной копии СУБД было отключено пользователем.
Процедура автоматического восстановления СУБД к исходному состоянию в случае непредвиденных ошибок в процессе обновления будет отключена.WARNING

Затем производится проверка наличия необходимых Linux-пакетов и, в случае их отсутствия, выполняется их установка, подготовка виртуального окружения Python, определение текущего active и standby.

Проверка пути до директории для резервного копирования

Осуществляется проверка пути до директории для резервного копирования.

Если обнаружены ошибки при определении пути до директории резервной копии, будет выведена следующая ошибка:

FAIL__E03024:Обнаружены ошибки в процессе определения пути до каталога резервной копии.
В директории {pgbackup_path} был обнаружен следующий перечень возможных путей '{list_of_dirs}'.
Определить точный путь до резервной копии не удалось.
Скорректируйте содержимое директории {pgbackup_path}, оставив только актуальный каталог с резервной копией и перезапустите механизм обновления.FAIL

Где:

  • pgbackup_path – путь до директории для создания РК;
  • list_of_dirs – список директорий внутри pgbackup_path.

Проверка учетной записи для резервного копирования

Выполняется следующий запрос к БД:

SELECT pg_roles.rolname FROM pg_roles WHERE rolname='{{ user_for_backup }}';

Где user_for_backup – имя УЗ для резервного копирования.

Если учетная запись для резервного копирования отсутствует, то будет выведена следующая ошибка:

FAIL__E03015:Техническая учетная запись {user_for_backup} не используется в процессе резервного копирования.
Рекомендуется проверить наличие указанного пользователя в конфигурационном файле компонента или произведите проверку наличия пользователя в БД.FAIL

Где user_for_backup – имя УЗ для резервного копирования.

Проверка, что переданный адрес active соответствует действительности

Производится проверка соответствия роли master, указанного в файле config.yml, и фактического указания роли master на стенде.

В случае, если мастер не соответствует переданному в конфигурации, скрипт прервется с ошибкой:

FAIL__E03033:В кандидате на обновление текущий мастер в СУБД не соответствует переданному пользователем значению.
На текущий момент обновление невозможно, необходимо выполнить switchover.FAIL

Получение состояний компонентов для определения типа установленной конфигурации

Выполняется проверка наличия параметра CLNAME в bash_profile пользователя postgres.

Если параметр отсутствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03093:Укажите актуальное имя кластера в {} в параметре '- export CLNAME= 'FAIL

Выполняется проверка наличия всех файлов сертификатов, указанных в пользовательском конфигурационно файле.

Если файлы сертификатов отсутствуют, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E02002:Файл '{path_to_certs}' не найден на хосте {inventory_hostname}.
Проверьте наличие файла и значение в кастомном конфигурационном файле - '{path_to_config}'FAIL

Где:

  • path_to_certs – путь до сертификатов, указанный в пользовательском конфигурационном файле;
  • inventory_hostname – имя узла стенда;
  • path_to_config – путь до пользовательского конфигурационного файла.
примечание

Скрипты обновления не осуществляют проверку валидности сертификатов.

Проверка соответствия установленных компонентов кластера с текущим типом конфигурации

Выполняется следующий запрос к БД:

SHOW installer.cluster_type;

Результат данного запроса сравнивается со списком установленных компонентов.

Если будут найдены несоответствующие компоненты, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03095:Текущий тип конфигурации, согласно конфигурационному параметру СУБД - {type_of_configuration}, при этом обнаружены несоответствующие конфигурации компоненты: {list_of_components}. Удалите несоответствующие компоненты.FAIL

Где:

  • type_of_configuration – тип установленной конфигурации;
  • list_of_components – список несоответствующих компонент.

Проверка минимальной поддерживаемой версии СУБД, над которой может быть выполнен сценарий разведки/обновления

Скрипт запрашивает информацию об установленной версии. Сравнивает версию с параметром, отвечающим за минимальную поддерживаемую версию, который, в свою очередь, берет информацию из матрицы версий.

Если версия не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03017:Обновление невозможно, так как текущая версия ({current_db_version}) не поддерживается.
Минимальная поддерживаемая версия: {min_db_version}.
Рекомендуется обновиться на промежуточную версию.FAIL

Где:

  • current_db_version – версия Pangolin, установленная на стенде;
  • min_db_version – минимально поддерживаемая версия Pangolin для обновления.

Информация о поддерживаемых версиях для обновления содержится в разделе «Таблица поддерживаемых для обновления версий СУБД».

Проверка поддержки версии Pangolin, на которую планируется обновление

Производится проверка версии экземпляра СУБД Pangolin, на которую планируется обновление с помощью скриптов автоматизации.

Если версия Pangolin, на которую планируется обновление, не поддерживается текущими скриптами автоматизации, будет выведена следующая ошибка:

FAIL__E03025:Обновление невозможно, так как версия, на которую производится обновление не поддерживается.
Смотрите матрицу обновлений версий СУБД.FAIL

Проверка типа установленной конфигурации Pangolin

Скрипт запрашивает информацию об установленном типе конфигурации и сравнивает его со списком неподдерживаемых.

Если тип конфигурации не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03020:Обновление невозможно из-за установленного типа конфигурации: {configuration_type}.
Приведите тип конфигурации к одному из поддерживаемых типов (как за счет чистой установки новой СУБД, так и за счет ручного изменения типа конфигурации).FAIL

Где configuration_type – тип установленной конфигурации.

Список поддерживаемых вариантов конфигурации:

  • cluster-patroni-etcd-pgbouncer;
  • cluster-patroni-dcs-pgbouncer;
  • standalone-postgresql-only;
  • standalone-postgresql-pgbouncer;
  • standalone-patroni-etcd-pgbouncer;
  • standalone-1c-dbms;
  • cluster-1c-patroni-dcs;
  • cluster-1c-patroni-etcd.

Проверка наличия корректной конфигурации кластера

Данная проверка актуальна только при обновлении кластерной конфигурации СУБД.

Скрипт проверяет наличие используемого модуля Pangolin DCS, после чего проверяет корректность конфигурации, выставленной в конфигурационном файле postgres.yml в параметре installer.cluster_type.

Если установленный тип конфигурации стенда в конфигурационном файле postgres.yml отличается от фактически используемой компоненты распределенного хранилища конфигурации будет выведено следующее сообщение:

WARNING__W03020:На стенде используется неподдерживаемая совместно с включенным Pangolin DCS конфигурация {configuration}. Необходимо актуализировать параметр installer.cluster_type в конфигурационном файле СУБД либо ДО, либо ПОСЛЕ обновления СУБД.WARNING

Данное сообщение не блокирует обновление, но настоятельно рекомендуется скорректировать параметр installer.cluster_type так как в будущих версиях обновление с подобным расхождением типа используемой конфигурации и фактически используемых компонентов будет невозможно.

Где configuration – используемая конфигурация.

Процесс актуализации кластерной конфигурации

Действия выполняются на мастере и на реплике поочереди.

  1. В конфигурационном файле /etc/pangolin-manager/postgres.yml изменить значение параметра installer.cluster_type на cluster-patroni-dcs-pgbouncer.

  2. Перечитать конфигурационный файл postgres.yml и перезагрузить СУБД с помощью следующих команд:

    sudo su - postgres
    reload
    restart
  3. Проверить что конфигурация на узле успешно изменилась:

    sudo su - postgres
    psql -c "SHOW installer.cluster_type;"

    Ожидаемый результат:

    installer.cluster_type
    --------------------------------
    cluster-patroni-dcs-pgbouncer
    (1 row)

Определение типа обновления

Скрипт проверки самостоятельно определяет тип обновления по своему алгоритму, без дополнительных действий от пользователя.

Алгоритм действий проверки. На текущей СУБД запрашивается информация:

  • текущая версия;
  • включена или нет функциональность «Прозрачное защитное преобразование данных (TDE)»;
  • включена или нет функциональность «Защита данных от привилегированных пользователей (AP)».

Если тип обновления равен unsupported для текущей версии, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03026:Обновление в автоматическом режиме при наличии включенных средств защиты информации (TDE, защита конфигурации, защита данных от привилегированных пользователей) для версии ({current_db_version}) в текущей версии скриптов автоматизации невозможно.FAIL

Где current_db_version – установленная версия СУБД.

Проверка свободного места

Производится проверка свободного места в точке монтирования PGBACKUP (пример: /pgarclogs/0{base_version}). Требуется минимум 1 Гбайт.

Если места не хватает, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03090:Точка монтирования {PGBACKUP} имеет {current_free_space} Гбайт свободного пространства, но требуется не менее 1 Гбайт.FAIL

Где current_free_space – количество свободного места в точке монтирования.

Сведения

Для обновления с переносом данных выполняется проверка размера СУБД.

Если размер СУБД больше чем задано в параметре maximum_dbms_size_to_update (параметр максимальный размер СУБД для обновления в настраиваемом конфигурационном файле), то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03038:Автоматическое обновление ограничено размером табличных пространств кластера СУБД в {} Гбайт. Табличное пространство tbs_name имеет размер {} Гбайт.FAIL

Для обновления с переносом данных и полного внутреннего резервного копирования данных проверяется наличие на active каталога, указанного в параметре local_backup_path (путь для локального резервного копирования) в конфигурационном файле или переданного на вход скрипта в виде --extra-vars.

Если каталог отсутствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03014:Не найден каталог {local_backup_path}, указанный в качестве каталога для создания локального резервного копирования. Создайте каталог.FAIL

Проверка свободного места для точки монтирования local_backup_path

Производится проверка наличия свободного места для осуществления резервного копирования в директорию local_backup_path (отображается в логе как «локальный бэкап»). Данная проверка складывается из следующих параметров:

  • Размер кластера СУБД (текущего каталога pgdata).
  • Вычисляется процент от размера кластера СУБД. Процент задается в параметре local_backup_coefficient в настраиваемом конфигурационном файле (по умолчанию равен 1%).
  • 1 Гбайт, если точка монтирования local_backup_path совпала с точкой монтирования для PGBACKUP.

Если в точке монтирования для local_backup_path не хватает места, то выводится ошибка:

FAIL__E03089:Недостаточно свободного места для локального бэкапа в {local_backup_path}.
Доступно {local_backup_path_free_mb} Мбайт.
Требуется >= {pgdata_size_need_mb} Мбайт.FAIL

Где:

  • local_backup_path – директория для создания локальной резервной копии (бэкап);
  • local_backup_path_free_mb – количество свободного места в local_backup_path, указано в МБ;
  • pgdata_size_need_mb – количество необходимого свободного места в local_backup_path, указано в МБ.

Проверка свободного места для точек монтирования

Производится проверка наличия свободного места для точек монтирования:

  • /usr/;
  • pangolin_ansible_cache;
  • pgdata;
  • PGBACKUP;
  • PGLOGS.

Если для указанных точек монтирования не хватает места, будет выведена следующая ошибка:

FAIL__E01012:Точка монтирования {dir} имеет {current_free_space} Гбайт свободного пространства, но требуется не менее {needed_free_space} Гбайт.FAIL

Где:

  • dir – точка монтирования;
  • current_free_space – свободное пространство в точке монтирования;
  • needed_free_space – необходимый объем свободного пространства в точке монтирования.

Проверка наличия свободного места для точек монтирования, содержащих табличные пространства

Производится проверка свободного места для табличных пространств.

Если для табличных пространств недостаточно места, то будет выведена следующая ошибка:

FAIL__E03044:Недостаточно свободного места в точке монтирования {mount_name} для выполнения обновления.
Доступно свободного места {current_free_space} Мбайт, требуется {needed_free_space} МбайтFAIL

Где:

  • mount_name – название точки монтирования;
  • current_free_space – текущий объем свободного места;
  • needed_free_space – необходимый объем свободного места.

Проверка наличия точек монтирования в рабочем каталоге PGDATA

Производится проверка наличия точек монтирования в рабочем каталоге PGDATA.

Если в рабочем каталоге PGDATA были обнаружены точки монтирования, будет выведена следующая ошибка:

FAIL__E03072:В кандидате на обновление обнаружены точки монтирования в рабочем каталоге /pgdata: {mount_name}.
Размонтируйте найденные каталоги для дальнейшего обновления.FAIL

Где mount_name – название точки монтирования.

Проверка точек монтирования

Производится проверка прав для записи в каталоги, которые могут быть точками монтирования – PGDATA, PGBACKUP и PGLOGS.

Если скриптам развертывания не удается выполнить запись в данные каталоги, то выводится ошибка:

FAIL__E01013:Инсталлятор не может записать файлы в директорию {dir_path}.
Проверьте маску директории или назначьте владельца postgres.FAIL

Где dir_path – полный путь до директории.

Проверка консистентности виртуальных сред

Производится проверка наличия виртуальных сред по путям, указанным в конфигурационном файле, а также консистентности установленных библиотек в данных виртуальных окружениях.

В случае, если виртуального окружения не существует или в нем отсутствует какая-либо из зависимостей, будет выведено сообщение:

FAIL__E03075:Не найдена директория со старой версий virutalenv в директории PGHOME на хосте: {inventory_hostname}.
Для корректной проверки установите из дистрибутива rpm пакет pangolin-installer-venv-controlled расположенный в {path_to_rpm} на хосте с которого запускается проверка перед обновлением.FAIL

Где:

  • inventory_hostname – имя узла стенда;
  • path_to_rpm – полный путь до rpm-пакета.

После чего утилита развертывания/обновления будет производить установку пакетов в автоматическом режиме.

Проверка наличия корректных прав для каталогов текущая PGDATA, PGBACKUP, local_backup_path

Производится попытка создания тестовых файлов в каталогах PGDATA, PGBACKUP, local_backup_path под пользователя postgres.

Если создать данные файлы не удается, будет выведена следующая ошибка:

FAIL__E03029:Пользователь postgres должен иметь rwx права на каталог '{dir_path}'.
Приведите права на каталог к целевому виду.FAIL

Где dir_path – полный путь до директории.

Проверка ACL правил для каталогов PGDATA, PGBACKUP, PGLOGS, PGDATA_DCS

Производится проверка наличия default правил ACL для директорий PGDATA, PGBACKUP, PGLOGS, PGDATA_DCS, а также их поддиректорий.

Если default ACL правила найдены, будет выведена следующая ошибка:

"FAIL__E01054:Для директории {dir_path} обнаружены default правила ACL: {acl} на хосте: {hostname}.
Наличие наследуемых ACL может привести к некорректным правам файлов и сбоям установки, обновления и работы компонентов Pangolin.
Удалите найденные default ACL.FAIL"

Где dir_path – полный путь до директории.

Проверка корректного местоположения каталога для сохранения локальной резервной копии

Производится проверка каталога для сохранения локальной резервной копии.

Если в параметре local_backup_path, пользовательского конфигурационного файла, указан некорректный путь, то будет выведена следующая ошибка:

FAIL__E03083:Путь для сохранения локального бэкапа не должен находиться в /pgdata, /pgdata[0-99] или содержать кириллицу.FAIL

Если в параметре local_backup_path, пользовательского конфигурационного файла, указан путь до каталога, в котором находятся табличные пространства, то будет выведена следующая ошибка:

FAIL__E03084:Локальный бэкап не может находиться в каталоге с табличным пространством.FAIL

Проверка расположения служб без использования функционала «Отказ от root» в процессе эксплуатации

Выполняется проверка местоположения служб текущей версии Pangolin.

Если файлы служб будут располагаться в разных системных каталогах, будет выведена следующая ошибка:

FAIL__E03108:Файлы служб располагаются в разных системных каталогах. Для продолжения мигрируйте сервисные файлы в один системный каталог. Текущее расположение файлов: {path_to_file}FAIL

Где path_to_file - абсолютный путь до расположения файла службы.

Проверка корректности расположения служб, при включенной функциональности «Отказ от root» в процессе эксплуатации

Осуществляется проверка местоположения служб текущей версии Pangolin.

Если какая-либо служба будет находиться в системном каталоге служб, в то время, как все остальные находятся в пользовательском каталоге, будет выведена следующая ошибка:

FAIL__E03078:Служба {service_list} находится в системном каталоге служб, так как другие компоненты находятся в пользовательской директории служб.
Для продолжения мигрируйте сервисный файл в директорию пользователя.FAIL

Где service_list – список сервисов, находящихся в системном каталоге служб.

Проверка состояния служб

Осуществляется проверка состояния служб текущей версии СУБД Pangolin.

Если какая-либо служба, необходимая для корректной работы СУБД, выключена, то будет выведена следующая ошибка:

FAIL__E03079:Служба {service_name} не запущена. Проверьте состояние сервисаFAIL

Где service_name – название службы.

Проверка структуры каталогов PGDATA

Скрипт запрашивает структуру каталогов на active и standby для кластерной конфигурации.

Если структура каталогов отличается, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03036:Разная структура каталогов в каталоге pgdata на серверах.
Структура pgdata должна быть одинаковой на мастере и реплике.
Со структурой можно ознакомиться в логе задачи (имя таски: pgdata directory structure).FAIL

Проверка символических ссылок в PGDATA

Скрипт запрашивает на active и standby список всех символических ссылок в каталоге PGDATA и определяет куда они направлены.

Если символические ссылки отличаются, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03037:Отличаются символические ссылки в каталоге pgdata на серверах.
Приведите символические ссылки к целевому виду.
Со списком символических ссылок можно ознакомиться в логе задачи (имя таски: symlinks in pgdata).FAIL

При обработке ошибки необходимо перейти в лог выполнения задачи и поиском найти задачу symlinks in pgdata. В задаче распечатана информация для анализа различий.

Проверка установленных расширений с поддерживаемыми расширениями

Под пользователем postgres выполняется запрос к БД:

SELECT format('{{ item.datname }}.%1$s.%2$s',nspname,extname) extname FROM pg_catalog.pg_extension ex
JOIN pg_namespace ns ON ex.extnamespace =ns.oid
WHERE ex.extname not in (<_list_extensions><additional_legal_ext>);

В запросе происходит сравнение установленных расширений с поддерживаемыми.

legal_extensions: "'amcheck', 'auth_delay', 'auto_explain', 'autoinc', 'bloom', 'btree_gin', 'btree_gist', \
'citext', 'cube', 'dblink', 'dict_int', 'dict_xsyn', 'earthdistance', 'file_fdw', 'fuzzystrmatch', 'hstore', \
'hstore_plperl', 'hstore_plperlu', 'hstore_plpython3u', 'insert_username', 'intagg', 'intarray', 'isn', \
'jsonb_plperl', 'jsonb_plperlu', 'jsonb_plpython3u', 'lo', 'ltree', 'ltree_plpython3u', 'moddatetime', \
'pageinspect', 'pg_buffercache', 'pg_freespacemap', 'pg_prewarm', 'pg_stat_statements', 'pg_variables', \
'pg_trgm', 'pg_visibility', 'pgcrypto', 'pgrowlocks', 'pgstattuple', 'plperl', 'plperlu', 'plpgsql', 'pltcl', \
'plpython3u', 'plan_cache_limit', 'pg_freeze_recovery', 'ptrack', 'old_snapshot', 'psql_license_info', \
'pltclu', 'postgres_fdw', 'refint', 'seg', 'sslinfo', 'tablefunc', 'tcn', 'tsm_system_rows', 'tsm_system_time', \
'unaccent', 'uuid-ossp', 'xml2', 'bool_plperlu', 'bool_plperl', 'rum', 'oid2name', 'online_analyze', \
'pg_backup', 'pg_standby', 'protected_dump', 'pg_profile', 'orafce', 'pg_squeeze', 'pg_cron', 'pg_repack', \
'pgse_backup', 'pg_hint_plan', 'pg_outline', 'oracle_fdw', 'tds_fdw', 'psql_lockmon', 'pg_stat_kcache', \
'psql_rotate_password', 'fasttrun', 'fulleq', 'mchar', 'psql_diagpack', 'pg_store_plans', 'pg_orphaned', \
'psql_resources_consumption_limits', 'vector', 'pg_surgery', 'pg_walinspect', 'anon', 'psql_data_lineage', 'psql_bfile', 'plantuner', \
'postgis', 'postgis_raster', 'postgis_sfcgal', 'postgis_topology', 'address_standardizer', 'address_standardizer_data_us', \
'postgis_tiger_geocoder', 'pg_background', 'pgrouting'"
Внимание!

Расширения (pgq, pgq_coop, pgqd, pgsql-http, pldebugger, plpgsql_check, pgcopydb, pgloader), не входящие в состав Pangolin, не поддерживаются скриптами автоматического обновления.

Для обновления исполняемых файлов, в поддерживаемые добавляется расширение: timescaledb.

Если список не пустой, то:

  • для обновления исполняемых файлов выводится предупреждающее сообщение:

    WARNING__W03001:Текущая версия СУБД содержит расширения, не входящие в состав Pangolin (<имя базы>.<имя схемы>.<имя расширения>): {extension_list}. После обновления проверьте работу расширений.WARNING

    Где extension_list – список неподдерживаемых расширений.

  • для обновления с переносом данных выводится не блокирующая выполнение сценария ошибка:

    FAIL__E03019:Текущая версия СУБД содержит расширения, не входящие в состав Pangolin или для данных расширений обновление не поддерживается. (<имя базы>.<имя схемы>.<имя расширения>): {extension_list} Удалите данные расширения.FAIL

    Где:

    • list_of_extensions – список неподдерживаемых расширений в параметре shared_preload_libraries;
    • inventory_hostname – наименование узла стенда.

Если неподдерживаемое расширение находится в параметре shared_preload_libraries:

FAIL__E03069:В кандидате на обновление обнаружены неподдерживаемые расширения {list_of_extensions} в параметре shared_preload_libraries на хосте {inventory_hostname}.FAIL

Проверка статуса состояния снятия РК (только для промышленной эксплуатации)

Проверяется статус снятия РК через представление backup.history.

При получении значения статуса, отличного от failed, complited или waiting_from_wal_backup, будет выведена ошибка, блокирующая выполнение сценария:

FAIL__E03092:Обновление невозможно, так как активна сессия снятия РК внешней службой.
Дождитесь окончания снятия РК со стендаFAIL

Проверка наличия каталога для временных файлов

Производится проверка наличия каталога для временных файлов.

{{ local_backup_path }}/scout_temp_data

В случае отсутствия каталога будет выведена следующая ошибка:

FAIL__E03014:Не найден каталог {}, указанный в качестве каталога для создания локального резервного копирования. Создайте каталог.FAIL

Проверка минимальной конфигурации CPU и RAM на обновляемых стендах

Проверка осуществляется путем сбора системных параметров стенда и сравнения с минимальными значениями, указанными в файле конфигурации config.yml.

Если проверка обнаружила несоответствие минимальным требованиям, будет выдана ошибка:

FAIL__E03047:Хост {inventory_hostname} не соответствует минимальным требованиям по CPU.
Минимальное количество ядер: {min_cpu}.FAIL

FAIL__E03048:Хост {inventory_hostname} не соответствует минимальным требованиям по RAM.
Минимальное значение {min_ram} Гбайт.__{{ control_name }} Гбайт.FAIL"

Где:

  • inventory_hostname – наименование узла стенда;
  • min_cpu – минимально допустимое количество ядер CPU;
  • min_ram – минимально допустимое количество оперативной памяти, Гбайт.

Проверка достаточного количества оперативной памяти необходимой для обновления

Проводится проверка достаточного количества оперативной памяти необходимой для обновления.

Если оперативной памяти будет недостаточно, то будет выведена следующая ошибка:

FAIL__E03034:В кандидате на обновление обнаружен недостаток свободной оперативной памяти.
Для успешного выполнения операции разведки и последующего обновления shared_buffers тестовой базы необходимо не менее {need_ram} ГБ или не менее {need_percent_ram}% свободной оперативной памяти.
Сейчас доступно {free_ram} ГБ.FAIL

Где:

  • need_ram – необходимое количество свободной оперативной памяти, Гбайт;
  • need_percent_ram – процент необходимой свободной оперативной памяти;
  • free_ram – текущее количество свободной оперативной памяти.

Проверка достаточного количества больших страниц (huge_pages)

Проводится проверка достаточного количества больших страниц, необходимых для успешного обновления.

Если больших страниц будет недостаточно, то будет выведена следующая ошибка:

    FAIL__E03114:При разведке обнаружено, что не хватает свободных страниц для работы с HugePages.
Необходимое число страниц для корректной работы базы: {huge_pages_recomended_number}.
Текущее число страниц, установленное в операционной системе: {huge_pages_total}.
Рекомендуется отключить поддержку больших страниц в базе на время обновления или увеличить число больших страниц, выделяемых операционной системой, выше минимально рекомендуемого.FAIL

Где:

  • huge_pages_recomended_number – рекомендованное минимальное число больших страниц с учетом запаса безопасности;
  • huge_pages_total – текущие число больших страниц, сконфигурированное на стенде;

Проверка одинаковой конфигурации узлов мастера и реплики

Проверка осуществляется путем сбора системных параметров мастера и реплики и сравнение их друг с другом.

Если проверка обнаружила несоответствие, будет выведена ошибка:

FAIL__E03049:Количество ядер CPU на мастере не соответствует количеству ядер CPU на реплике.FAIL

FAIL__E03050:Количество оперативной памяти на мастере не соответствует количетву оперативной памяти на реплике.FAIL

Проверка наличия установленных пакетов Pangolin разной версии

Происходит проверка наличия установленных пакетов platform-v-pangolin, postgresql-sber-edition и pangolin-dbms.

Если оба пакета установлены, то будет выведено сообщение:

FAIL__E03051:На стенде установлены несколько пакетов Pangolin: platform-v-pangolin-dbms и postgresql-sber-edition. Удалите неактуальный пакет.FAIL

Проверка существования файлов, блокирующих обновление

Выполняется проверка наличия файлов, блокирующих обновление.

Если во время повторного запуска обновления, были найдены файлы блокирующие обновление (disallow_update или .trigger_stop_update), то в зависимости от установленного рычага remove_block_update_tmp_files в конфигурационном файле они могут быть удалены.

Если рычаг remove_block_update_tmp_files выставлен в true, данные файлы будут автоматически удалены. После удаления будет выведено сообщение об удалении данных файлов:

INFO__I03003:Был найден и удален триггер прерывания обновления '{path_to_trigger}'.INFO
INFO__I03004:Был найден и удален файл предыдущего неудачного обновления '{path_to_block_file}'.INFO

Где:

  • path_to_trigger – полный путь до триггера, блокирующего обновление;
  • path_to_block_file – полный путь до файла, блокирующего обновление.

Если рычаг remove_block_update_tmp_files выставлен в false, данные файлы удалены не будут. В этом случае будет выведена следующая ошибка:

FAIL__E03022:Зафиксирован принудительный откат пользователем СУБД Pangolin.
Перед перезапуском обновления удалите файл {filename}.FAIL

Где filename – полный путь до файла, блокирующего обновление.

Проверка наличия утилиты vi на стенде

Производится проверка наличия утилиты vi на узлах стенда.

Если утилита vi отсутствует, будет выведено следующее предупреждающее сообщение:

WARNING__W01002:Утилита vi не обнаружена.
Отсутствие данной утилиты делает невозможным использование alias hba для пользователя postgres.
После установки/обновления БД необходимо изменить данный алиас на используемый в системе редактор.WARNING

Проверка установленного пакета СУБД Pangolin версии, на которую планируется обновление

Производится проверка наличия установленного пакета СУБД Pangolin версии, на которую планируется обновление.

Если скриптом-разведчиком будет обнаружен подобный пакет, то выводится ошибка:

FAIL__E03052:На стенде установлен пакет Pangolin версии {version}, на которую планируется обновление. Удалите данный пакет.FAIL

Где version – версия установленного на стенд пакета.

Проверка соответствия установленных версий Pangolin на узлах стенда

Производится проверка идентичности версий установленных пакетов Pangolin на узлах стенда.

Если будет зафиксирован несоответствие установленных версий Pangolin между узлами стенда, будет выведена следующая ошибка:

FAIL__E03076:Зафиксировано несоответствие установленных версий Pangolin между узлами кластера.FAIL

Проверка наличия необходимых компонентов на всех узлах стенда

Производится проверка наличия всех необходимых компонентов на всех узлах стенда.

Если проверка наличия необходимых компонентов не пройдена, будет выведена следующая ошибка:

FAIL__E03002:На узлах не совпадет тип развертывания для компонента {name_of_component}.
Для продолжения обновления необходимо, чтобы наличие компонента и его версия совпадали на всех узлах.FAIL

Если не пройдена проверка наличия одинаковых версий компонентов на всех узлах стенда, будет выведена следующая ошибка:

FAIL__E03003:На узлах обнаружены различные версии компонента {name_of_component}.
Для продолжения обновления необходимо, чтобы версии компонента на всех узлах совпадали.FAIL

Где name_of_component – название проблемного компонента.

Проверка возможности обновления компонента pangolin-backup-tools

Производится проверка возможности обновления компонента pangolin-backup-tools.

Если проверка не пройдена, будет выведена следующая ошибка:

FAIL__E03004:Обновление компонента 'pangolin-backup-tools' невозможно, ввиду некорректной предыдущей установки.FAIL

Проверка наличия конфигурационных файлов компонента pangolin-backup-tools

Производится проверка наличия конфигурационного файла компонента pangolin-backup-tools.

Если конфигурационный файл /etc/pangolin-backup-tools/backup-tools-env не будет найден, то будет выведена следующая ошибка:

FAIL__E03056:На хосте '{inventory_hostname}' для компонента '{name_of_component}' не удалось обнаружить конфигурационный файл {path_to_config}.
Необходимо проверить корректность настройки на стенде компонента {name_of_component}.FAIL

Где:

  • inventory_hostname – наименование узла стенда;
  • name_of_component – название компонента;
  • path_to_config – полный путь до конфигурационного файла компонента.

Проверка соответствия настроек pangolin-backup-tools на узлах кластера

Производится проверка соответствия настроек компонента pangolin-backup-tools между узлами кластера.

Если настройки pangolin-backup-tools не соответствуют друг другу на мастере и на реплике, будет выведена следующая ошибка:

FAIL__E03057:Обнаружено несоответствие настроек компонента 'pangolin-backup-tools' на нодах кластера.
Необходимо привести состяния стенда на всех нодах к одному состоянию.FAIL

Проверка наличия рабочих файлов для утилиты pangolin-backup-tools

Производится проверка наличия необходимых рабочих файлов для компонента pangolin-backup-tools.

Если на узлах кластера не будут обнаружены все файлы, необходимые для работы утилиты pangolin-backup-tools, то будет выведена следующая ошибка:

FAIL__E03059:На хосте '{inventory_hostname}' для компонента '{name_of_component}' был обнаружен не весь набор рабочих файлов.
Необходимо проверить корректность настройки на стенде компонента {name_of_component}.FAIL

Где:

  • inventory_hostname – наименование узла стенда;
  • name_of_component – название компонента.

Проверка корректности установки расширения pg_cron

Производится проверка корректности установки расширения pg_cron.

Если расширение pg_cron установлено в базу данных template0, будет выведена следующая ошибка:

FAIL__E03005:Расширение pg_cron не должно быть установлено в базу данных template0.
Удалите расширение из template0.FAIL

Если расширение pg_cron установлено в нескольких базах данных, будет выведена следующая ошибка:

FAIL__E03006:Текущая СУБД содержит инсталляции расширения pg_cron в нескольких баз данных.
(<имя базы>.<имя схемы>.<имя расширения>): \ {database_name}.
Расширение должно быть установлено только в одной баз данных, имя которой указано именем в параметре cron.
database_name. Удалите расширение из других баз данных.FAIL

Где database_name – название баз данных, в которых установлено расширение pg_cron.

Проверка корректности работы СУБД с засекреченным хранилищем

Если была включена функциональность засекречивания паролей, то для проверки ее корректной работы под пользователем postgres выполняется следующая команда:

/bin/pg_auth_config check

При не успешном прохождении проверки будет выведена следующая ошибка:

FAIL__E03045:Не прошла проверка доступа к базе данных с использованием засереченного хранилища паролей (pg_auth_config check), на стенде {inventory_hostname}. Ознакомьтесь с логами.FAIL

Где inventory_hostname – наименование узла стенда.

Проверка каталога исполняемых файлов в кластере СУБД Pangolin

Скрипт-разведчик выполняет сравнение каталогов с исполняемыми файлами на всех хостах с СУБД Pangolin.

Если каталоги отличаются, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

FAIL__E03077:Зафиксировано несоответствие директории {path_to_dir} между узлами кластера.
Необходимо произвести их корректировкуFAIL

Где path_to_dir – путь до проблемной директории.

Проверка корректности установки расширения pg_profile

Производится проверка корректности установки расширения pg_profile.

Если расширение pg_profile установлено в некорректную схему БД, будет выведена следующая ошибка:

FAIL__E03018:Обновление невозможно. Расширение 'pg_profile' должно быть установлено в схеме 'pgse_profile'.
Текущее значение: {name_of_schema}. FAIL

Где name_of_schema – имя текущей схемы, в которой установлено расширение pg_profile.

Проверки расширения timescaledb

Производятся проверки расширения timescaledb.

  1. Если на стенде установлена версия расширения timescaledb, неподдерживаемая в новой версии Pangolin, будет выведена следующая ошибка:

     FAIL__E03085:Сценарий обновления стендов с установленным расширением timescaledb не поддерживается.FAIL

    Где:

    • current_version – текущая версия расширения timescaledb;
    • needed_version – необходимая версия расширения timescaledb;
  2. Если на стенде установлено расширение timescaledb с неподдерживаемой лицензией, будет выведена следующая ошибка:

    FAIL__E03086:В БД используется расширение timescaledb с неподдерживаемой лицензией {type_of_license}.FAIL

    Где type_of_license – тип лицензии текущего расширения timescaledb.

Проверка возможности обновления расширения anon

Производится проверка версии расширения anon на предмет возможности его обновления.

Если обновление данного расширения не поддерживается, будет выведена следующая ошибка:

FAIL__E03104:Версии расширения anon из дистрибутива и БД: {current_version} не совпадают.
Обновление расширения не поддерживается.FAIL

Где current_version – текущая версия расширения anon.

Проверка корректности заполнения параметра shared_preload_liraries в конфигурационном файле

Производится проверка корректности заполнения параметра shared_preload_liraries в конфигурационном файле.

Если параметр shared_preload_liraries заполнен некорректно, будет выведена следующая ошибка:

FAIL__E03107:Обнаружено некорректное заполнение параметра shared_preload_libraries в конфгурационном файле postgresql.conf.
Строка со значением параметра shared_preload_libraries в конфигурационном файле postgresql.conf не может заканчиваться запятой.FAIL

Проверка соответствия информации об узлах кластера в конфигурационном файле и на самих узлах

Производится проверка соответствия между DNS записями узлов в конфигурационном файле СУБД и DNS записями на самих узлах.

Если в конфигурационном файле обнаружено несоответствие DNS записей с узлами кластера, будет выведена следующая ошибка:

FAIL__E03087:В конфигурационном файле {path_to_config} на хосте {inventory_hostname}, присутствует несоответствие DNS записей с хостами кластераFAIL

Где:

  • path_to_config – путь до конфигурационного файла;
  • inventory_hostname – наименование узла стенда.

Проверка наличия дубликатов параметров в конфигурационном файле

Производится проверка наличия дублирующих параметров в конфигурационном файле postgres.yml.

Если в конфигурационном файле pangolin-manager обнаружены дубликаты параметров, будет выведена следующая ошибка:

FAIL__E03010:В файле {path_to_config}/postgres.yml найдены параметры: {list_of_parameters}, имеющие дубли.
Удалите дубликаты параметров из конфигурационного файла.FAIL

Где:

  • path_to_config – полный путь до директории с конфигурационным файлом;
  • list_of_parameters – список дублирующихся параметров.

Проверка наличия unicode символов в конфигурационных файлах

Производится проверка наличия unicode символов в следующих конфигурационных файлах:

  • pg_hba.conf;
  • postgresql.conf;
  • postgres.yml (при кластерной конфигурации).

Если подобные символы будут обнаружены, то будет выведена следующая ошибка:

FAIL__E03032:В файле {path_to_config} найден символ unicode. Необходимо скорректировать конфигурационный файл.FAIL

Где path_to_config – полный путь до конфигурационного файла.

Проверка наличия include_file в конфигурационном файле

Производится проверка наличия include_file в конфигурационном файле postgresql.conf.

Если в конфигурационном файле postgresql.conf присутствуют дополнительные include, то будет выведена следующая ошибка:

FAIL__E03046:В конфигурационном файле postgresql.conf присутствуют дополнительные include из {include_file}.
Перенесите конфигурационные параметры из {include_file} в postgresql.conf и запустите проверку повторно.FAIL

Где include_file – список подключенных к postgresql.conf файлов.

Проверка количества созданных табличных пространств

Производится проверка количества созданных табличных пространств.

Если количество созданных табличных пространств больше или равно значению параметра disk_check_tablespaces_count, указанному в конфигурационном файле, будет выведена следующая ошибка:

FAIL__E03054:Количество созданных табличных пространств больше или равно значения параметра disk_check_tablespaces_count равному {disk_check_tablespaces_count_value}, указанного в конфигурационном файле СУБД.
disk_check_tablespaces_count определяет максимально возможное число табличных пространств, для которых может быть включена проверка доступности дисков. Увеличьте значение параметра disk_check_tablespaces_count.
Рекомендуем для расчета использовать формулу: disk_check_tablespaces_count = количество имеющихся tablespace + 32.FAIL

Где disk_check_tablespaces_count_value – текущее значение параметра disk_check_tablespaces_count.

Проверка наличия настроек SSL в конфигурационном файле

Производится проверка наличия параметров настройки SSL в конфигурационном файле.

Если в конфигурационном файле параметры не обнаружены, будет выведена следующая ошибка:

FAIL__E03068:Обновление невозможно, так как для параметров {parameter_names} не удалось обнаружить значения {parameter_value} в локальном конфигурационном файле баз данных {path_to_config}. Приведите файл в актуальное состояние, добавив необходимые настроечные параметры SSL и повторите запуск скрипта разведчика.FAIL

Где:

  • parameter_names – список параметров, которые не удалось обнаружить;
  • parameter_value – список значений, которые не удалось обнаружить;
  • path_to_config – полный путь до конфигурационного файла.

Проверка состояния близости БД к порогу заморозки транзакций autovacuum_freeze_max_age

Скрипт-разведчик получает возраст заморозки старейшей из баз, а также значение параметра autovacuum_freeze_max_age, установленного системно и для отдельных таблиц, TOAST-таблиц, после чего сравнивает возраст заморозки с наименьшим значением параметра autovacuum_freeze_max_age.

Если возраст заморозки больше 80% от наименьшего значения autovacuum_freeze_max_age выводится предупреждение:

WARNING__W03007:База данных близка к порогу принудительной заморозки транзакций.
Перед обновлением необходимо предварительно либо выполнить vacuumdb -a -F -v (заморозка транзакций в кластере баз), либо увеличить значение параметра autovacuum_freeze_max_age для таблиц в БД,
исходя из формулы max_frozen_age > 0.8 * autovacuum_freeze_max_age
Список таблиц:
{list_of_tables}.WARNING

WARNING__W03009:WARNING__W03009:База данных близка к порогу принудительной заморозки транзакций. Перед обновлением необходимо предварительно выполнить vacuumdb -a -F -v (заморозка транзакций в кластере баз), либо увеличить значение параметра autovacuum_freeze_max_age глобально, исходя из формулы max_frozen_age > 0.8 * autovacuum_freeze_max_age. Для получения списка проблемных объектов выполните ручную проверку для каждой базы данных, запустив скрипт, расположенный в разделе "Проверка состояния близости БД к порогу заморозки транзакций autovacuum_freeze_max_age" документации Pangolin.WARNING

Где list_of_tables – список таблиц, для которых необходимо увеличить значение параметра autovacuum_freeze_max_age.

Проверка количества транзакций с незавершенным статусом

Скрипт-разведчик выполняет поиск строк с незавершенным статусом транзакции.

Если количество подобных транзакций превышает 3,15 млн будет выведено предупреждение:

WARNING__W03008:Обнаружены базы данных с большим количеством транзакций с незавершенным статусом.
Рекомендуется выполнить следующую команду перед запуском обновления: vacuumdb -F -v -d db_name (запуск очистки базы данных ), где db_name - имя БД из списка.
Список БД: {list_of_databases}.WARNING"

Где list_of_databases – список баз данных, в которых обнаружено большое количество незавершенных транзакций.

Пороговое количество транзакций определено исходя из максимального количества записей, которые могут содержаться в одном журнале и количества самих журналов (эмпирически определено как три).

Проверка наличия untrusted расширений в БД

Выполняется проверка наличия в СУБД активированных расширений, использующих недоверенные языки программирования. Информация о данных расширениях находится в разделе Информация по Untrusted-расширениям.

В случае данные расширения будут обнаружены пользователю будет выведено следующее warning-сообщение:

WARNING__W01005:В СУБД присутствуют активированные untrusted расширения. Убедитесь в необходимости их использования. Eсли потребность в подобных расширениях отсутствует - удалите их перед обновлением.
Список баз:
{list_of_db}WARNING

Где list_of_db - список баз данных, в которых обнаружены untrusted-расширения

Проверка наличия корректных прав для объектов расширений

Выполняется проверка наличия корректных прав для объектов расширений

Для этого выполняется следующий SQL-скрипт:

WITH predef(objoid,objtype,objschema,objname,objidentity,extname,initprivs) AS MATERIALIZED (
SELECT pgd.objid,(pg_identify_object(pgd.classid,pgd.objid,pgd.objsubid)).*,pge.extname,pip.initprivs
FROM pg_catalog.pg_depend pgd
JOIN pg_catalog.pg_extension pge on pgd.refclassid='pg_catalog.pg_extension'::regclass
AND pgd.refobjid=pge.oid
LEFT JOIN pg_catalog.pg_init_privs pip on (pgd.classid,pgd.objid,pgd.objsubid,pgd.deptype)=(pip.classoid,pip.objoid,pip.objsubid,pip.privtype)
WHERE pgd.deptype IN ('e','x')
)
, by_class AS MATERIALIZED (
SELECT
predef.*,
relowner::regrole AS "realowner",
relacl AS "realprivs",
acldefault(translate(relkind,'fpI','rri')::"char",relowner::regrole) defprivs
FROM pg_catalog.pg_class JOIN predef on objtype IN ('table','sequence') AND pg_class.oid=predef.objoid
UNION all
SELECT
predef.*,
relowner::regrole,
relacl,
acldefault('r',relowner::regrole)
FROM pg_catalog.pg_class JOIN predef ON objtype IN ('view','materialized view') AND pg_class.oid=predef.objoid
UNION ALL
SELECT
predef.*,
nspowner::regrole,
nspacl,
acldefault('n',nspowner::regrole)
FROM pg_catalog.pg_namespace JOIN predef ON objtype IN ('schema') AND pg_namespace.oid=predef.objoid
UNION ALL
SELECT
predef.*,
spcowner::regrole,
spcacl,
acldefault('t',spcowner::regrole)
from pg_catalog.pg_tablespace join predef on objtype in ('tablespace') and pg_tablespace.oid=predef.objoid
union all
select
predef.*,
datdba::regrole,
datacl,
acldefault('d',datdba::regrole)
from pg_catalog.pg_database join predef on objtype in ('database') and pg_database.oid=predef.objoid
union all
select
predef.*,
proowner::regrole,
proacl,
acldefault('f',proowner::regrole)
from pg_catalog.pg_proc join predef on objtype in ('function','procedure') and pg_proc.oid=predef.objoid
union all
select
predef.*,
typowner::regrole,
typacl,
acldefault('T',typowner::regrole)
from pg_catalog.pg_type join predef on objtype in ('type') and pg_type.oid=predef.objoid
UNION ALL
select
predef.*,
lanowner::regrole,
lanacl,
acldefault('l',lanowner::regrole)
from pg_catalog.pg_language join predef on objtype in ('language') and pg_language.oid=predef.objoid
UNION ALL
select
predef.*,
fdwowner::regrole,
fdwacl,
acldefault('F',fdwowner::regrole)
from pg_catalog.pg_foreign_data_wrapper join predef on objtype in ('foreign data wrapper') and pg_foreign_data_wrapper.oid=predef.objoid
UNION ALL
select
predef.*,
srvowner::regrole,
srvacl,
acldefault('S',srvowner::regrole)
from pg_catalog.pg_foreign_server join predef on objtype in ('server') and pg_foreign_server.oid=predef.objoid
UNION ALL
select
predef.*,
evtowner::regrole,
array_agg(makeaclitem(evtowner::regrole::oid, evtowner::regrole::oid, 'CREATE'::text, false)) OVER(PARTITION BY predef.objtype,predef.objoid),
acldefault('t',evtowner::regrole)
from pg_catalog.pg_event_trigger JOIN predef on objtype in ('event trigger') AND pg_event_trigger.oid=predef.objoid
UNION ALL
SELECT
predef.*,
proowner::regrole,
array_agg(makeaclitem(proowner::regrole::oid, proowner::regrole::oid, 'CREATE'::text, false)) OVER(PARTITION BY predef.objtype,predef.objoid),
acldefault('t',proowner::regrole)
FROM pg_catalog.pg_am
JOIN pg_catalog.pg_proc ON pg_am.amhandler=pg_proc.oid::regproc
AND pg_proc.prorettype IN ('table_am_handler'::regtype,'index_am_handler'::regtype)
JOIN predef on objtype in ('access method') AND pg_am.oid=predef.objoid
UNION ALL
SELECT
predef.*,
opfowner::regrole,
array_agg(makeaclitem(opfowner::regrole::oid, opfowner::regrole::oid, 'CREATE'::text, false)) OVER(PARTITION BY predef.objtype,predef.objoid),
acldefault('t',opfowner::regrole)
FROM pg_catalog.pg_opfamily
JOIN predef on objtype in ('operator family') AND pg_opfamily.oid=predef.objoid
UNION ALL
SELECT
predef.*,
opcowner::regrole,
array_agg(makeaclitem(opcowner::regrole::oid, opcowner::regrole::oid, 'CREATE'::text, false)) OVER(PARTITION BY predef.objtype,predef.objoid),
acldefault('t',opcowner::regrole)
FROM pg_catalog.pg_opclass
JOIN predef on objtype in ('operator class') AND pg_opclass.oid=predef.objoid
), by_object(objoid,objtype,objschema,objname,objidentity,extname,initprivs,realowner,realprivs,defprivs,def_grantor,def_grantee,def_privilege,def_grantable) AS (
SELECT
by_class.*,
(aclexplode(COALESCE(initprivs,defprivs))).*
FROM by_class
), check_perms AS MATERIALIZED (
SELECT by_object.*,
CASE
WHEN objtype IN ('table','view','materialized view') THEN has_table_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('sequence') THEN has_sequence_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('schema') THEN has_schema_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('tablespace') THEN has_tablespace_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('database') THEN has_database_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('function','procedure') THEN has_function_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('type') THEN has_type_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('language') THEN has_language_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('foreign data wrapper') THEN has_foreign_data_wrapper_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('server') THEN has_server_privilege(def_grantor::regrole,objoid,def_privilege)
WHEN objtype IN ('event trigger','access method','operator family','operator class') THEN pg_has_role(def_grantor::regrole,10::oid,'MEMBER')
END AS has_permission
FROM by_object
)
SELECT current_database () db,extname,objtype,objidentity,def_grantor::regrole::name role_actor,array_to_string(array_agg(def_privilege ORDER BY def_privilege),',') unsufficient_privileges
FROM check_perms
WHERE NOT has_permission
GROUP BY extname,objtype,objidentity,def_grantor::regrole::name
ORDER BY extname,objtype,objidentity;

В случае если проверка не пройдена, пользователю будет выведена следующая ошибка:

FAIL__E03117:В расширении {ext_name} обнаружены объекты с некорректными правами доступа. БД: {db_name}, объект: {obj} (тип: {obj_type}), пользователь {role_actor}, недостающие привилегии: {unsufficient_privileges}. Необходимо выдать недостающие права пользователю к объекту расширения..FAIL

Где:

  • ext_name - имя расширения, к которому относится объект;
  • db_name - название текущей базы данных;
  • obj - уникальный идентификатор или имя объекта;
  • obj_type - тип объекта базы данных;
  • role_actor - имя роли, для которой проверяются привилегии;
  • unsufficient_privileges - список привилегий, которые отсутствуют у роли для данного объекта.

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

В скрипт-разведчик добавлена проверка наличия пользователей с хешами пароля в формате md5.

В случае нахождения выводится WARNING-сообщение:

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

Проверки перед обновлением СУБД Pangolin со сторонними расширениями

При данном обновлении выполняются все проверки из блока «Проверки для всех типов обновления», также проверки перечисленные далее в данном подблоке и далее проверки в зависимости от типа обновления:

Проверка возможности обновления стенда с текущей версией расширения и проверка минимально допустимых версий зависимостей

Происходит проверка версий сторонних расширений на предмет поддержки сценарием обновления. При наличии установленного PostGIS, также происходит проверка версий зависимостей на предмет соответствия минимальным.

В случае появления неожиданной ошибки, будет выведено сообщение о непрохождении проверки:

FAIL__E03120:Стороннее расширение и/или его зависимости не поддерживаются.
Текст ошибки: Версия 1.3.2 зависимости sfcgal не поддерживается.
Версия зависимости должна быть не ниже 1.5.*.
Для продолжения обновите версию расширения и/или зависимостей до одной из указанных версий.FAIL
FAIL__E03120:Стороннее расширение и/или его зависимости не поддерживаются.
Текст ошибки: Версия 2.1.0 расширения pgrouting не поддерживается.
Поддерживаемые версии: 3.1.2, 3.5.0, 3.6.1.
Для продолжения обновите версию расширения и/или зависимостей до одной из указанных версий.FAIL

Проверка, что в текущей БД и при текущем пользователе схема, в которой создано расширение PostGIS включено в search_path (иначе остальные расширения не могут быть загружены, они не найдут типы данных и spatial_ref_sys)

Происходит поиск и добавление схемы в search_path для расширений.

В случае непрохождения проверки будет выведено сообщение следующего формата:

FAIL__E03118:Текущая база данных содержит расширение PostGIS в схеме, не отраженной в search_path.
Производные расширения и объекты не могут использовать типы данных PostGIS.
Для продолжения необходимо включить схему, в которой установлено расширение PostGIS, в search_path текущей базы данных.
Найденный объекты: {}.FAIL

Проверка, что пользователь не внес свои SRID, несовместимые с PostGIS и блокирующие установку

Происходит поиск и замена несовместимых SRID на допустимые, либо происходит удаление таких объектов.

В случае непрохождения проверки будет выведено сообщение следующего формата:

FAIL__E03119:Текущая база данных {} содержит расширение PostGIS со справочником SRID, несовместимым с обновляемой версией.
Для продолжения необходимо удалить найденные объекты из БД. Найденный объекты: {}.FAIL

Проверка возможности обновления стенда с выбранным режимом работы утилиты pg_upgrade

Происходит проверка возможности обновления стенда с выбранным режимом работы утилиты pg_upgrade, сопровождающаяся следующим сообщением:

FAIL__E03123:На стенде установлено расширение PostGIS.
Выбранный режим обновления для данного стенда не поддерживается.
Для продолжения выставите параметр two_phases_update в значение true.FAIL

Проверка списка элементов параметра two_phases_extensions

Происходит проверка списка элементов параметра two_phases_extensions, сопровождающаяся следующим сообщением:

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

Проверка изменений функций расширений

При обновлении могут возникать предупреждения (WARNING). Они не блокируют процесс обновления, но сигнализируют о том, что в схеме расширений PostGIS или PgRouting изменяются функции. Это может повлиять на работу прикладного кода, использующего эти функции, поэтому такие предупреждения необходимо учитывать при планировании обновления.

  • Проверка изменений функций расширения PostGIS:
WARNING-сообщение

WARNING__W03022:Обновление расширения PostGIS приведет к изменению следующих функций в схеме расширения:
_ST_AsGeoJson(int4, geography, int4, int4)
_ST_AsGeoJson(int4, geometry, int4, int4)
_ST_AsGeoJson(int4, geometry, int4, int4)
_st_asgml(int4, geography, int4, int4, text) \
_st_asgml(int4, geography, int4, int4, text, text)
_st_asgml(int4, geometry, int4, int4, text)
_st_askml(int4, geography, int4, text)
_st_askml(int4, geometry, int4, text)
_st_buffer(geometry, float8, cstring)
_st_distance(geography, geography, float8, boolean)
_ST_DistanceRectTree(g1 geometry, g2 geometry) \
_ST_DistanceRectTreeCached(g1 geometry, g2 geometry)
_ST_DumpPoints(geometry, integer[])
_ST_LineCrossingDirection(geom1 geometry, geom2 geometry)
_ST_OrderingEquals(GeometryA geometry, GeometryB geometry)
AddAuth(text)
AddGeometryColumn(catalog_name character varying, schema_name character varying,
table_name character varying,column_name character varying, new_srid integer,
new_type character varying, new_dim integer, use_typmod boolean) \
AddGeometryColumn(varchar, varchar, integer, varchar, integer)
AddGeometryColumn(varchar, varchar, varchar, integer, varchar, integer)
AddGeometryColumn(varchar, varchar, varchar, varchar, integer, varchar, integer)
box2d_contain(box2d,box2d)
box2d_contained(box2d,box2d)
box2d_intersects(box2d,box2d)
box2d_left(box2d,box2d)
box2d_overlap(box2d,box2d)
box2d_overleft(box2d,box2d)
box2d_overright(box2d,box2d)
box2d_right(box2d,box2d) \
box2d_same(box2d, box2d)
cache_bbox()
CheckAuth(text, text)
CheckAuth(text, text, text)
CheckAuthTrigger()
collect_garray (geometry[])
collector(geometry, geometry)
DisableLongTransactions()
EnableLongTransactions()
geography_gist_join_selectivity(internal, oid, internal, smallint)
geography_gist_selectivity (internal, oid, internal, int4)
geom_accum (geometry[],geometry)
geometry_distance_box_nd(geometry, geometry) \
geometry_gist_joinsel_2d(internal, oid, internal, smallint)
geometry_gist_sel_2d (internal, oid, internal, int4)
geosnoop(geometry)
GetTransactionID()
jtsnoop(geometry)
LockRow(text, text, text)
LockRow(text, text, text, text)
LockRow(text, text, text, text, timestamp)
LockRow(text, text, text, timestamp)
LongTransactionsEnabled()
pgis_abs_in(cstring)
pgis_abs_out(pgis_abs)
pgis_geometry_accum_finalfn(internal)
pgis_geometry_accum_finalfn(internal) \
pgis_geometry_accum_finalfn(pgis_abs)
pgis_geometry_accum_transfn(pgis_abs, geometry)
pgis_geometry_collect_finalfn(pgis_abs)
pgis_geometry_makeline_finalfn(pgis_abs)
pgis_geometry_polygonize_finalfn(pgis_abs)
pgis_geometry_union_finalfn(internal)
pgis_geometry_union_finalfn(pgis_abs)
pgis_geometry_union_transfn(internal, geometry)
pgis_twkb_accum_finalfn(internal)
pgis_twkb_accum_transfn(internal, geometry, integer) \
pgis_twkb_accum_transfn(internal, geometry, integer, bigint)
pgis_twkb_accum_transfn(internal, geometry, integer, bigint, bool)
pgis_twkb_accum_transfn(internal, geometry, integer, bigint, bool, bool)
populate_geometry_columns()
populate_geometry_columns(oid)
postgis_uses_stats()
SnapToGrid(geometry, float8, float8)
st_3dlength_spheroid(geometry, spheroid)
st_addbbox(geometry)
st_area(geography)
ST_AsBinary(text)
ST_AsGeoJson(geography) \
ST_AsGeoJson(geography, int4)
ST_AsGeoJson(geometry)
ST_AsGeoJson(geometry, int4)
ST_AsGeoJson(int4, geography)
ST_AsGeoJson(int4, geography, int4)
ST_AsGeoJson(int4, geography, int4, int4)
ST_AsGeoJson(int4, geometry)
ST_AsGeoJson(int4, geometry, int4)
ST_AsGeoJson(int4, geometry, int4, int4)
ST_AsGeoJson(int4, geometry, int4, int4)
ST_AsGeoJson(r record, geom_column text, maxdecimaldigits integer, pretty_print boolean) \
st_asgml(geography)
st_asgml(geography, int4)
st_asgml(geography, int4, int4)
st_asgml(geometry)
st_asgml(geometry, int4)
st_asgml(int4, geography)
st_asgml(int4, geography, int4)
st_asgml(int4, geography, int4, int4)
st_asgml(int4, geography, int4, int4, text)
st_asgml(int4, geometry)
st_asgml(int4, geometry, int4)
st_asgml(int4, geometry, int4, int4)
st_asgml(int4, geometry, int4, int4, text)
st_askml(geography)
st_askml(geometry) \
st_askml(int4, geography, int4)
st_askml(int4, geography, int4, text)
st_askml(int4, geometry, int4)
st_askml(int4, geometry, int4, text)
ST_AsKML(int4, geometry, int4, text)
ST_AsLatLonText(geometry)
ST_AsLatLonText(geometry, text)
st_assvg(geography)
st_assvg(geography, int4)
st_assvg(geometry)
st_assvg(geometry, int4)
st_astwkb(geometry, integer, bigint, bool, bool)
ST_AsX3D(geom geometry, prec integer, options integer)
st_asx3d(geometry) \
st_asx3d(geometry, int4)
st_box(box3d)
st_box(geometry)
st_box2d(box3d)
st_box2d(geometry)
st_box2d_contain(box2d, box2d)
st_box2d_contained(box2d, box2d)
st_box2d_in(cstring)
st_box2d_intersects(box2d, box2d)
st_box2d_left(box2d, box2d)
st_box2d_out(box2d)
st_box2d_overlap(box2d, box2d)
st_box2d_overleft(box2d, box2d)
st_box2d_overright(box2d, box2d)
st_box2d_right(box2d, box2d)
st_box2d_same(box2d, box2d)
st_box3d(box2d)
st_box3d(geometry) \
ST_Buffer(geometry, float8, cstring)
st_bytea(geometry)
st_cache_bbox()
st_collect_garray (geometry[])
st_collector(geometry, geometry)
st_combine_bbox(box2d, geometry)
st_combine_bbox(box3d, geometry)
ST_ConcaveHull(geometry,float)
ST_CoverageInvalidLocations(geometry, double precision)
ST_Distance(geography, geography)
ST_Distance(geography, geography, float8, boolean)
st_distance_sphere(geometry, geometry)
st_distance_spheroid(geometry, geometry, spheroid) \
st_dropbbox(geometry)
st_estimated_extent(text,text)
st_estimated_extent(text,text,text)
st_find_extent(text,text)
st_find_extent(text,text,text)
st_force_2d(geometry)
st_force_3d(geometry)
st_force_3dm(geometry)
st_force_3dz(geometry)
st_force_4d(geometry)
st_force_collection(geometry)
ST_GeneratePoints(geometry, numeric)
ST_GeoHash(geometry)
st_geom_accum (geometry[],geometry)
st_geometry(box2d)
st_geometry(box3d)
st_geometry(bytea)
st_geometry(text) \
st_geometry_analyze(internal)
st_geometry_cmp(geometry, geometry)
st_geometry_eq(geometry, geometry)
st_geometry_ge(geometry, geometry)
st_geometry_gt(geometry, geometry)
st_geometry_in(cstring)
st_geometry_lt(geometry, geometry)
st_geometry_out(geometry)
st_geometry_recv(internal)
st_geometry_send(geometry)
st_hasbbox(geometry)
ST_IsValidDetail(geometry)
st_length(geography)
st_length2d_spheroid(geometry, spheroid)
st_length_spheroid(geometry, spheroid) \
st_line_interpolate_point(geometry, float8)
st_line_locate_point(geometry, geometry)
st_line_substring(geometry, float8, float8)
ST_LineCrossingDirection(geom1 geometry, geom2 geometry)
st_locate_along_measure(geometry, float8)
st_locate_between_measures(geometry, float8, float8)
st_max_distance(geometry, geometry)
st_mem_size(geometry)
ST_MinimumBoundingCircle(geometry)
st_noop(geometry)
ST_OrderingEquals(GeometryA geometry, GeometryB geometry)
st_perimeter(geography) \
st_point_inside_circle(geometry, float8, float8, float8)
ST_RemoveIrrelevantPointsForView(geometry, box2d)
st_removerepeatedpoints(geometry)
st_seteffectivearea(geometry, double precision)
st_shift_longitude(geometry)
st_spheroid_in(cstring)
st_spheroid_out(spheroid)
st_text(geometry)
st_voronoi(geometry, geometry, double precision, boolean)
transform_geometry(geometry, text, text, int)
UnlockRows(text) \
UpdateGeometrySRID(catalogn_name character varying, schema_name character varying, tabe_name character varying, column_name character varying, new_srid integer).
Учитывайте это при планировании обновления стенда с PostGIS.WARNING
  • Проверка изменений функций расширения PgRouting:
WARNING-сообщение

WARNING__W03023:Обновление расширения Pgrouting приведет к изменению следующих функций в схеме расширения:
pgrbddijkstra(text,anyarray,anyarray,boolean,boolean),
pgrdijkstra(text,anyarray,anyarray,boolean,boolean,boolean),
pgrgsoc_vrppdtw(text,integer,double precision,double precision,integer),
pgrmakedistancematrix(text),
pgrunnest_matrix(double precision[]),
pgr_alphashape(text,double precision),
pgr_apspjohnson(text),
pgr_apspwarshall(text,boolean,boolean),
pgr_articulationpoints(text),
pgr_astar(text,anyarray,bigint,boolean,integer,double precision,double precision),
pgr_astar(text,bigint,anyarray,boolean,integer,double precision,double precision),
pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision),
pgr_astar(text,integer,integer,boolean,boolean),
pgr_bdastar(text,anyarray,bigint,boolean,integer,numeric,numeric),
pgr_bdastar(text,bigint,anyarray,boolean,integer,numeric,numeric),
pgr_bdastar(text,bigint,bigint),
pgr_bdastar(text,bigint,bigint,boolean,integer,numeric,numeric),
pgr_bdastar(text,integer,integer,boolean,boolean),
pgr_bddijkstra(text,bigint,anyarray,boolean),
pgr_bddijkstra(text,bigint,bigint),
pgr_bddijkstra(text,integer,integer,boolean,boolean),
pgr_biconnectedcomponents(text),
pgr_bridges(text),
pgr_connectedcomponents(text),
pgr_contractgraph(text,bigint[],integer,bigint[],boolean),
pgr_dijkstra(text,anyarray,bigint,boolean),
pgr_dijkstra(text,bigint,anyarray,boolean),
pgr_dijkstra(text,bigint,anyarray,boolean),
pgr_dijkstra(text,bigint,bigint),
pgr_dijkstra(text,bigint,bigint,boolean),
pgr_dijkstra(text,integer,integer,boolean,boolean),
pgr_drivingdistance(text,anyarray,double precision,boolean,boolean),
pgr_drivingdistance(text,bigint,double precision,boolean),
pgr_drivingdistance(text,bigint,double precision,boolean),
pgr_drivingdistance(text,bigint,double precision,boolean,boolean),
pgr_endpoint(geometry),
pgr_euclediantsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean),
pgr_flipedges(geometry[]),
pgr_getcolumnname(text,text),
pgr_gettablename(text),
pgr_gsoc_vrppdtw(text,integer,integer),
pgr_iscolumnindexed(text,text),
pgr_iscolumnintable(text,text),
pgr_kdijkstracost(text,integer,integer[],boolean,boolean),
pgr_kdijkstrapath(text,integer,integer[],boolean,boolean),
pgr_kruskalbfs(text,anyarray,bigint),
pgr_kruskalbfs(text,bigint,bigint),
pgr_kruskaldd(text,anyarray,double precision),
pgr_kruskaldd(text,anyarray,numeric),
pgr_kruskaldd(text,bigint,double precision),
pgr_kruskaldd(text,bigint,numeric),
pgr_kruskaldfs(text,anyarray,bigint),
pgr_kruskaldfs(text,bigint,bigint),
pgr_ksp(text,bigint,bigint,integer,boolean,boolean),
pgr_ksp(text,integer,integer,integer,boolean),
pgr_labelgraph(text,text,text,text,text,text),
pgr_maxcardinalitymatch(text,boolean),
pgr_maxflowboykovkolmogorov(text,anyarray,anyarray),
pgr_maxflowboykovkolmogorov(text,anyarray,bigint),
pgr_maxflowboykovkolmogorov(text,bigint,anyarray),
pgr_maxflowboykovkolmogorov(text,bigint,bigint),
pgr_maxflowedmondskarp(text,anyarray,anyarray),
pgr_maxflowedmondskarp(text,anyarray,bigint),
pgr_maxflowedmondskarp(text,bigint,anyarray),
pgr_maxflowedmondskarp(text,bigint,bigint),
pgr_maxflowpushrelabel(text,anyarray,anyarray),
pgr_maxflowpushrelabel(text,anyarray,bigint),
pgr_maxflowpushrelabel(text,bigint,anyarray),
pgr_maxflowpushrelabel(text,bigint,bigint),
pgr_maximumcardinalitymatching(text,boolean),
pgr_pointsaspolygon(character varying,double precision),
pgr_pointstodmatrix(geometry[],integer),
pgr_pointstovids(geometry[],text,double precision),
pgr_pointtoedgenode(text,geometry,double precision),
pgr_primbfs(text,anyarray,bigint),
pgr_primbfs(text,bigint,bigint),
pgr_primdd(text,anyarray,double precision),
pgr_primdd(text,anyarray,numeric),
pgr_primdd(text,bigint,double precision),
pgr_primdd(text,bigint,numeric),
pgr_primdfs(text,anyarray,bigint),
pgr_primdfs(text,bigint,bigint),
pgr_quote_ident(text),
pgr_startpoint(geometry),
pgr_strongcomponents(text),
pgr_texttopoints(text,integer),
pgr_tsp(double precision[],integer,integer),
pgr_tsp(text,integer,integer),
pgr_version(),
pgr_versionless(text,text),
pgr_vidstodmatrix(integer[],geometry[],text,double precision),
pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean),
pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean),
pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean),
pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,char,boolean).
Актуализируйте свой код, если используете функции из списка.WARNING

Проверки для обновления с переносом данных

При данном типе обновления выполняются все проверки из блока «Проверки для всех типов обновлению», а также проверки перечисленные в данном блоке.

Проверка типа обновления

Производится определение типа обновления. Если требуется обновление с переносом данных, будет выведено следующее предупреждение:

WARNING__W03034:Необходимо обновление с переносом данных. Данный тип обновления требует дополнительного времени и свободного места на диске. Рекомендуется создание резервной копии перед обновлением.

Проверка типа файловой системы для каталогов текущая PGDATA, новая PGDATA, PGBACKUP, local_backup_path

Для каталогов запрашивается тип файловой системы. Список каталогов:

PGDATA (пример: /pgdata/0{base_version}/data)
корневая для каталога PGDATA директория (пример:/pgdata)
PGBACKUP (пример: /pgarclogs/0{base_version})
local_backup_path (пример: /pgarclogs)

Для обновления с переносом данных, типы файловой системы для каталогов текущей PGDATA и корневой для нее директории должны совпадать.

Если типы файловой системы не равны, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03035:Для продолжения обновления необходимо, чтобы директории с текущей PGDATA и корневой для нее директорией /pgdata находились в одной файловой системе.

Тип файловой системы: текущая PGDATA: {pgdata_old_filesystem}, корневая /pgdata: {}.FAIL

Для каталогов PGDATA, PGBACKUP и local_backup_path выполняется проверка соответствия файловой системы каталога со списком разрешенных файловых систем allowed_fs. Список разрешенных файловых систем может конфигурироваться пользователем. По умолчанию разрешена только одна файловая система - ext4.

Если файловые системы для каталогов PGDATA, PGBACKUP и local_backup_path не соответствуют списку разрешенных файловых систем, то выводится блокирующая дальнейшее выполнение сценария ошибка:

FAIL__E03121:Файловая система каталогов {incorrect_filesystem} не соответствует списку разрешенных файловых систем {allowed_fs}.
Для данных каталогов необходимо скорректировать используемые файловые системы.
В случае, если ошибка ложноположительная необходимо скорректировать список поддерживаемых файловых систем с помощью параметра allowed_fs в пользовательском конфигурационном файле и перезапустить сценарий разведки.FAIL

Где:

  • local_backup_path – путь до директории с локальной резервной копией;
  • pgdata_old_filesystem – тип файловой системы в каталоге текущей PGDATA;
  • pgbackup_filesystem – тип файловой системы в каталоге PGBACKUP;
  • local_backup_filesystem – тип файловой системы в каталоге локальной резервной копии;
  • incorrect_filesystem - список каталогов, используемых неразрешенные файловые системы;
  • allowed_fs - список разрешенный файловых систем.

Проверка наличия пользовательского списка разрешенных файловых систем

Выполняется проверка наличия пользовательского списка разрешенных файловых систем, отличного от значения по умолчанию.

Если будет обнаружено наличие пользователь пользовательского списка разрешенных файловых систем, отличного от значения по умолчанию (ext4), пользователю будет выведено следующее warning-сообщения:

WARNING__W03021:В процессе работы сценария разведки перед обновлением будет использоваться список разрешенных файловых систем, указанный в пользовательском конфигурационном файле. Пользователь, выполняющий обновление и заполняющий список разрешенных ФС, должен самостоятельно оценить влияние использования файловых систем, отличных от значений по умолчанию. Любые последствия использования ФС, отличных от значений по умолчанию, вплоть до нарушения целостности данных, лежат в ответственности пользователя.
Список разрешенных файловых систем:
{}WARNING

Проверка наличия ссылок/директорий, необходимых для обновления

Осуществляются проверки наличия ссылок/директорий, используемых в процессе обновления.

  1. Если на стенде существует директория, используемая для переноса данных после миграции, будет выведена следующая ошибка:

    FAIL__E03039:Уже существует директория {new_pgdata_tmp} для переноса данных после миграции.
    Удалите директорию для дальнейшего обновления.FAIL

    Где new_pgdata_tmp – полный путь до директории в которую планируется перенос данных после миграции.

  2. Если на стенде существует директория, используемая для создания резервной копии, будет выведена следующая ошибка:

    FAIL__E03040:Уже существует директория {local_backup_path}, в которой будут созданы резервные копии обновляемой базы данных.
    Удалите или переименуйте директорию для дальнейшего обновления.FAIL

    Где local_backup_path – директория до нового каталога, необходимого для создания локальной резервной копии.

  3. Если на стенде существуют директории, используемые для работы СУБД после обновления, будут выведены следующие ошибки:

    • Если существует директория для новой PGDATA:

      FAIL__E03041:Уже существует директория /pgdata/{new_pgdata_dir}, которая будет использоваться после обновления.
      Удалите или переименуйте директорию для дальнейшего обновления.FAIL

      Где new_pgdata_dir – директория до каталога с новой PGDATA.

    • Если существует директория для pgbackup:

      FAIL__E03042:Уже существует директория {new_pgbackup_dir}, которая будет использоваться после обновления.
      Удалите или переименуйте директорию для дальнейшего обновления.FAIL

      Где new_pgbackup_dir – директория до нового каталога pgbackup.

Проверка отсутствия неподдерживаемых reg-типов

Выполняется проверка более неподдерживаемых reg-типов. В рамках проверки выполняется запрос к БД:

WITH RECURSIVE src AS (
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::TEXT
,pt.typcategory::text
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pgc ON pa.attrelid =pgc.oid
JOIN pg_catalog.pg_type pt ON pa.atttypid=pt."oid"
WHERE
format('%1$I.%2$I',pt.typnamespace::regnamespace::TEXT,pt.typname) IN (
VALUES
('pg_catalog.regcollation'),
('pg_catalog.regconfig'),
('pg_catalog.regdictionary'),
('pg_catalog.regnamespace'),
('pg_catalog.regoper'),
('pg_catalog.regoperator'),
('pg_catalog.regproc'),
('pg_catalog.regprocedure')
)
AND pa.attnum >0
UNION ALL
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::TEXT
,pt.typcategory::text
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pgc ON pa.attrelid =pgc.oid
JOIN pg_catalog.pg_type pt ON pt.oid=pa.atttypid
JOIN src ON pt.typrelid=src.attrelid
WHERE
pa.attnum > 0
)
SELECT format('%1$s %2$I.%3$I.%4$I::%5$s '
,COALESCE(relk.relkind_desc,src.relkind)
,src.relnamespace::regnamespace::TEXT
,src.attrelid::regclass::TEXT
,src.attname::TEXT
,src.atttypid::regtype::TEXT
)
FROM src
LEFT JOIN
(VALUES
('r', 'Table'),
('i', 'Index'),
('S', 'Sequence'),
('t', 'TOAST'),
('v', 'View'),
('m', 'MatView'),
('c', 'CompositeType'),
('f', 'ForeignTable'),
('p', 'PartitionedTable'),
('I', 'PartitionedIndex'),
('G', 'GlobalIndex')
) AS relk(relkind, relkind_desc) using(relkind)
WHERE relnamespace::regnamespace::text !~ '^(information_schema|pg_)';

Если в ходе проверки будут обнаружены более неподдерживаемые reg-типы, будет выведена следующая ошибка:

FAIL__E03011: Не поддерживается использование reg-типов: regcollation, regconfig, regdictionary, regnamespace, regoper, regoperator, regproc, regprocedure и типа aclitem в пользовательском пространстве.
Список таблиц, использующих их (<имя схемы>.<имя таблицы>(<имя колонки>)): {deprecated_regtypes}.
Необходимо изменить соответствующие типы данных в таблицах, материализованных представлениях, индексах для продолжения работы.
В качестве альтернативы для reg-типов можно рассмотреть тип integer, для типа aclitem - тип text.FAIL

Где deprecated_regtypes – список таблиц.

Проверка массива типов из information_schema

Выполняется запрос к БД:

-- scout types/01 . Information schema objects in array
WITH RECURSIVE src AS (
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::TEXT
,pt.typcategory::text
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pgc ON pa.attrelid =pgc.oid
JOIN pg_catalog.pg_type pt ON pa.atttypid=pt."oid"
WHERE
format('%1$I.%2$I',pt.typnamespace::regnamespace::TEXT,pt.typname) IN (
VALUES
('information_schema.__pg_foreign_data_wrappers'),-- 652
('information_schema.__pg_foreign_servers'),-- 652
('information_schema.__pg_foreign_table_columns'),-- 652
('information_schema.__pg_foreign_tables'),-- 652
('information_schema.__pg_user_mappings'),-- 652
('information_schema._administrable_role_authorizations'),-- 652
('information_schema._applicable_roles'),-- 652
('information_schema._attributes'),-- 652
('information_schema._cardinal_number'),-- 652
('information_schema._character_data'),-- 652
('information_schema._character_sets'),-- 652
('information_schema._check_constraint_routine_usage'),-- 652
('information_schema._check_constraints'),-- 652
('information_schema._collation_character_set_applicability'),-- 652
('information_schema._collations'),-- 652
('information_schema._column_column_usage'),-- 652
('information_schema._column_domain_usage'),-- 652
('information_schema._column_options'),-- 652
('information_schema._column_privileges'),-- 652
('information_schema._column_udt_usage'),-- 652
('information_schema._columns'),-- 652
('information_schema._constraint_column_usage'),-- 652
('information_schema._constraint_table_usage'),-- 652
('information_schema._data_type_privileges'),-- 652
('information_schema._domain_constraints'),-- 652
('information_schema._domain_udt_usage'),-- 652
('information_schema._domains'),-- 652
('information_schema._element_types'),-- 652
('information_schema._enabled_roles'),-- 652
('information_schema._foreign_data_wrapper_options'),-- 652
('information_schema._foreign_data_wrappers'),-- 652
('information_schema._foreign_server_options'),-- 652
('information_schema._foreign_servers'),-- 652
('information_schema._foreign_table_options'),-- 652
('information_schema._foreign_tables'),-- 652
('information_schema._information_schema_catalog_name'),-- 652
('information_schema._key_column_usage'),-- 652
('information_schema._parameters'),-- 652
('information_schema._pg_foreign_data_wrappers'),-- 652
('information_schema._pg_foreign_servers'),-- 652
('information_schema._pg_foreign_table_columns'),-- 652
('information_schema._pg_foreign_tables'),-- 652
('information_schema._pg_user_mappings'),-- 652
('information_schema._referential_constraints'),-- 652
('information_schema._role_column_grants'),-- 652
('information_schema._role_routine_grants'),-- 652
('information_schema._role_table_grants'),-- 652
('information_schema._role_udt_grants'),-- 652
('information_schema._role_usage_grants'),-- 652
('information_schema._routine_column_usage'),-- 652
('information_schema._routine_privileges'),-- 652
('information_schema._routine_routine_usage'),-- 652
('information_schema._routine_sequence_usage'),-- 652
('information_schema._routine_table_usage'),-- 652
('information_schema._routines'),-- 652
('information_schema._schemata'),-- 652
('information_schema._sequences'),-- 652
('information_schema._sql_features'),-- 652
('information_schema._sql_identifier'),-- 652
('information_schema._sql_implementation_info'),-- 652
('information_schema._sql_parts'),-- 652
('information_schema._sql_sizing'),-- 652
('information_schema._table_constraints'),-- 652
('information_schema._table_privileges'),-- 652
('information_schema._tables'),-- 652
('information_schema._time_stamp'),-- 652
('information_schema._transforms'),-- 652
('information_schema._triggered_update_columns'),-- 652
('information_schema._triggers'),-- 652
('information_schema._udt_privileges'),-- 652
('information_schema._usage_privileges'),-- 652
('information_schema._user_defined_types'),-- 652
('information_schema._user_mapping_options'),-- 652
('information_schema._user_mappings'),-- 652
('information_schema._view_column_usage'),-- 652
('information_schema._view_routine_usage'),-- 652
('information_schema._view_table_usage'),-- 652
('information_schema._views'),-- 652
('information_schema._yes_or_no'),-- 652
('information_schema.administrable_role_authorizations'),-- 652
('information_schema.applicable_roles'),-- 652
('information_schema.attributes'),-- 652
('information_schema.cardinal_number'),-- 652
('information_schema.character_data'),-- 652
('information_schema.character_sets'),-- 652
('information_schema.check_constraint_routine_usage'),-- 652
('information_schema.check_constraints'),-- 652
('information_schema.collation_character_set_applicability'),-- 652
('information_schema.collations'),-- 652
('information_schema.column_column_usage'),-- 652
('information_schema.column_domain_usage'),-- 652
('information_schema.column_options'),-- 652
('information_schema.column_privileges'),-- 652
('information_schema.column_udt_usage'),-- 652
('information_schema.columns'),-- 652
('information_schema.constraint_column_usage'),-- 652
('information_schema.constraint_table_usage'),-- 652
('information_schema.data_type_privileges'),-- 652
('information_schema.domain_constraints'),-- 652
('information_schema.domain_udt_usage'),-- 652
('information_schema.domains'),-- 652
('information_schema.element_types'),-- 652
('information_schema.enabled_roles'),-- 652
('information_schema.foreign_data_wrapper_options'),-- 652
('information_schema.foreign_data_wrappers'),-- 652
('information_schema.foreign_server_options'),-- 652
('information_schema.foreign_servers'),-- 652
('information_schema.foreign_table_options'),-- 652
('information_schema.foreign_tables'),-- 652
('information_schema.information_schema_catalog_name'),-- 652
('information_schema.key_column_usage'),-- 652
('information_schema.parameters'),-- 652
('information_schema.referential_constraints'),-- 652
('information_schema.role_column_grants'),-- 652
('information_schema.role_routine_grants'),-- 652
('information_schema.role_table_grants'),-- 652
('information_schema.role_udt_grants'),-- 652
('information_schema.role_usage_grants'),-- 652
('information_schema.routine_column_usage'),-- 652
('information_schema.routine_privileges'),-- 652
('information_schema.routine_routine_usage'),-- 652
('information_schema.routine_sequence_usage'),-- 652
('information_schema.routine_table_usage'),-- 652
('information_schema.routines'),-- 652
('information_schema.schemata'),-- 652
('information_schema.sequences'),-- 652
('information_schema.sql_features'),-- 652
('information_schema.sql_identifier'),-- 652
('information_schema.sql_implementation_info'),-- 652
('information_schema.sql_parts'),-- 652
('information_schema.sql_sizing'),-- 652
('information_schema.table_constraints'),-- 652
('information_schema.table_privileges'),-- 652
('information_schema.tables'),-- 652
('information_schema.time_stamp'),-- 652
('information_schema.transforms'),-- 652
('information_schema.triggered_update_columns'),-- 652
('information_schema.triggers'),-- 652
('information_schema.udt_privileges'),-- 652
('information_schema.usage_privileges'),-- 652
('information_schema.user_defined_types'),-- 652
('information_schema.user_mapping_options'),-- 652
('information_schema.user_mappings'),-- 652
('information_schema.view_column_usage'),-- 652
('information_schema.view_routine_usage'),-- 652
('information_schema.view_table_usage'),-- 652
('information_schema.views'),-- 652
('information_schema.yes_or_no')-- 652
)
AND pa.attnum >0
UNION ALL
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::TEXT
,pt.typcategory::text
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pgc ON pa.attrelid =pgc.oid
JOIN pg_catalog.pg_type pt ON pt.oid=pa.atttypid
JOIN src ON pt.typrelid=src.attrelid
WHERE
pa.attnum > 0
)
SELECT format('%1$s %2$I.%3$I.%4$I::%5$s '
,COALESCE(relk.relkind_desc,src.relkind)
,src.relnamespace::regnamespace::TEXT
,src.attrelid::regclass::TEXT
,src.attname::TEXT
,src.atttypid::regtype::TEXT
)
FROM src
LEFT JOIN
(VALUES
('r', 'Table'),
('i', 'Index'),
('S', 'Sequence'),
('t', 'TOAST'),
('v', 'View'),
('m', 'MatView'),
('c', 'CompositeType'),
('f', 'ForeignTable'),
('p', 'PartitionedTable'),
('I', 'PartitionedIndex'),
('G', 'GlobalIndex')
) AS relk(relkind, relkind_desc) using(relkind)
WHERE relnamespace::regnamespace::text !~ '^(information_schema|pg_)' AND src.typcategory='A';

Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:

FAIL__E03012:Не поддерживаются массивы типов из information_schema. Список таблиц, использующих их (<имя схемы>.<имя таблицы>(<имя колонки>) {}.
Необходимо изменить соответствующие типы данных в таблицах, материализованных представлениях для продолжения работы.FAIL

Где list_of_tables – список таблиц.

Проверка отсутствия неподдерживаемых функций

Осуществляется проверка наличия функций неподдерживаемых в новой версии Pangolin.

Если в процессе проверки обнаружены подобные функции, будет выведена следующая ошибка:

FAIL__E03080:Зафиксированы функции, которые не поддерживаются в новой версии Pangolin.
Список функций: {list_of_functions}FAIL

Где list_of_functions – список неподдерживаемых функций.

Проверка наличия схем с oid 2200

Осуществляется проверка наличия схем с oid = 2200.

Если обнаружены схемы с oid = 2200, отличные от схемы public, будет выведена следующая ошибка:

FAIL__E03088:В кандидате на обновление обнаружены схемы с oid 2200 отличные от public в следующих базах данных: {list_of_databases}.
Для продолжения обновления необходимо произвести переименование схем в public.FAIL

Где list_of_databases – список баз данных.

Проверка наличия поддерживаемых операторов

Осуществляется проверка наличия операторов, неподдерживаемых в новой версии Pangolin.

Если в ходе проверки будут обнаружены подобные операторы, то будет выведена следующая ошибка:

"FAIL__E03094:Зафиксированы операторы, которые не поддерживаются в новой версии Pangolin.
Список операторов: {list_of_operators}FAIL"

Где list_of_operators – список операторов.

Проверка наличия неподдерживаемых полиморфных типов

Производится проверка наличия неподдерживаемых полиморфных типов.

Если в ходе проверки будут обнаружены неподдерживаемые полиморфные типы, то будет выведена ошибка:

"FAIL__E03096:Зафиксированы полиморфные типы, которые не поддерживаются в новой версии Pangolin.
Список полиморфных типов: {list_of_polymorphic_types}FAIL"

Где list_of_polymorphic_types – список полиморфных типов.

Проверка наличия в таблицах полей с типом xid

Выполняется запрос к БД:

WITH RECURSIVE src AS (
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
WHERE
pa.atttypid::regtype::text IN ('xid','xid[]') AND
pa.attnum > 0 AND
pc.relkind != 'v'
UNION ALL
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
JOIN pg_catalog.pg_type pt ON pt.oid = pa.atttypid
JOIN src ON pt.typrelid = src.attrelid
WHERE
pa.attnum > 0 AND
pc.relkind != 'v'
)
SELECT format('%1$s(%2$s)',attrelid,attname) tbl_xid
FROM src
WHERE relnamespace::regnamespace::text !~ '^(information_schema|pg_)';

Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:

"FAIL__E03073:Обнаружена(ы) таблица(ы) в которой(ых) присутствует(ют) поле(я) с типом xid.
В новой версии СУБД Pangolin применяется 64-битный счетчик транзакций.
Необходимо удалить поле(я) с типом xid в таблице(ах).
Список таблиц, использующих их (<имя таблицы>(<имя колонки>)): {list_of_tables}FAIL"

Где list_of_tables – список проблемных таблиц.

Проверка с помощью утилиты pg_upgrade

Проверка возможности обновления с помощью утилиты pg_upgrade check.

Если проверка завершается с ошибкой, то выводится не блокирующая выполнение сценария ошибка.

При наличии в пользовательском файле конфигурации параметра is_print_pg_upgrade_logs в значении true ошибка выглядит следующим образом:

FAIL__E03016:Не прошла одна из проверок pg_upgrade.
С ошибками можно ознакомиться на хосте master в директории {path_to_log} или в логе задачи (имя таски: journal pg_upgrade).
Устраните возникшие ошибки в работе pg_upgrade.FAIL

При отсутствии данного параметра, либо значении false, ошибка будет выглядеть так:

FAIL__E03016:Не прошла одна из проверок pg_upgrade.
С ошибками можно ознакомиться на хосте master в директории {path_to_log}.
Устраните возникшие ошибки в работе pg_upgrade.FAIL

Где path_to_log – директория до лога работы утилиты pg_upgrade.

При обработке ошибки необходимо перейти в лог выполнения задачи и поиском найти задачу journal pg_upgrade. В задаче распечатаны все лог-файлы утилиты pg_upgrade.

Проверка с помощью утилиты pg_dumpall

Проверка осуществляется с помощью утилиты pg_dumpall --schema-only --no-tablespaces --no-privileges. Проверка заключается в снятии дампа схемы на текущей БД и загрузка схемы в экземпляр основанный на новой версии.

Во время выполнения могут быть выведены следующие ошибки:

  • Если снять дамп исходной СУБД не удалось, то выводится следующая блокирующая ошибка:

    FAIL__E03074:Снять дамп с исходной СУБД не удалось.
    Возникли следующие ошибки: {error_stdout}.FAIL
  • Если во время старта СУБД произошла неожиданная ошибка, то выводится блокирующая выполнение сценария ошибка:

    FAIL__E03030:Обнаружена ошибка во время старта СУБД для проверки загрузки схемы данных.
    Список ошибок: {error_stdout}.FAIL
  • Если во время загрузки схемы данных происходит понятная ошибка, то выводится не блокирующая выполнение сценария ошибка:

    FAIL__E03023:Найдены ошибки во время проверки загрузки схемы данных.
    Ссылка на схему данных в папке с логами: {inventory_hostname}: {path_to_log}/currentdb.sql.
    Список ошибок {error_stdout}. Если анализ выявил, что ошибка ложноположительная.
    Добавьте ошибку в фильтр в переменную {false_error_filter_for_data_schema} кастомного конфигурационного файла.FAIL

Где:

  • inventory_hostname – наименование узла стенда;
  • path_to_log – путь до директории с логами;
  • error_stdout – оригинальный текст ошибки;
  • false_error_filter_for_data_schema – наименование переменной, в которую необходимо внести изменения.

Проверка наличия логической репликации

Происходит проверка наличия логической репликации в СУБД.

Если она будет найдена, то будет выведено сообщение:

FAIL__E03055:На стенде {inventory_hostname} обнаружено использование логической репликации.
Удалите слот(ы): {name_of_slots}, для продолжения обновления.
В настоящий момент обновление с наличием слотов логической репликации не подддерживается.FAIL

Где:

  • inventory_hostname – наименование узла стенда;
  • name_of_slots – имена слотов логической репликации.

Проверка наличия нестандартных прав или нестандартных владельцев для объектов

Выполняется SQL-запрос к БД:

WITH RECURSIVE src AS (
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::TEXT
,pt.typcategory::text
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pgc ON pa.attrelid =pgc.oid
JOIN pg_catalog.pg_type pt ON pa.atttypid=pt."oid"
WHERE
format('%1$I.%2$I',pt.typnamespace::regnamespace::TEXT,pt.typname) IN (
VALUES
('pg_catalog.regcollation'),
('pg_catalog.regconfig'),
('pg_catalog.regdictionary'),
('pg_catalog.regnamespace'),
('pg_catalog.regoper'),
('pg_catalog.regoperator'),
('pg_catalog.regproc'),
('pg_catalog.regprocedure')
)
AND pa.attnum >0
UNION ALL
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::TEXT
,pt.typcategory::text
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pgc ON pa.attrelid =pgc.oid
JOIN pg_catalog.pg_type pt ON pt.oid=pa.atttypid
JOIN src ON pt.typrelid=src.attrelid
WHERE
pa.attnum > 0
)
SELECT format('%1$s %2$I.%3$I.%4$I::%5$s '
,COALESCE(relk.relkind_desc,src.relkind)
,src.relnamespace::regnamespace::TEXT
,src.attrelid::regclass::TEXT
,src.attname::TEXT
,src.atttypid::regtype::TEXT
)
FROM src
LEFT JOIN
(VALUES
('r', 'Table'),
('i', 'Index'),
('S', 'Sequence'),
('t', 'TOAST'),
('v', 'View'),
('m', 'MatView'),
('c', 'CompositeType'),
('f', 'ForeignTable'),
('p', 'PartitionedTable'),
('I', 'PartitionedIndex'),
('G', 'GlobalIndex')
) AS relk(relkind, relkind_desc) using(relkind)
WHERE relnamespace::regnamespace::text !~ '^(information_schema|pg_)';

Если запрос выведет не пустое значение, будет выведена следующая ошибка:

FAIL__E03007:В кандидате на обновление обнаружены нестандартные права или нестандартный владелец для объектов: {list_of_objects}.
Восстановите права доступа или владельца перечисленных объектов, так как в новой версии СУБД они отсутствуют.FAIL

Где list_of_objects – список объектов в БД с нестандартными правами/владельцем.

Проверка близости к порогу принудительной заморозки транзакций

WITH tab_opts_toasts AS
(
SELECT c.oid reloid,
c.reltoastrelid reltoast,
c.relkind relkind,
ot.option_value::bigint force_freeze_age,
c.relnamespace::regnamespace tab_schema,
c.relname relname,
age(c.relfrozenxid) tab_frozen_age
FROM pg_class c LEFT OUTER JOIN pg_options_to_table(c.reloptions) ot ON ot.option_name = 'autovacuum_freeze_max_age'
WHERE relkind = ANY('{"r","t","m"}')
)

SELECT
current_database() db,
CASE tot.relkind WHEN 'r' THEN 'table autovacuum_freeze_max_age'
WHEN 't' THEN 'TOAST autovacuum_freeze_max_age'
WHEN 'm' THEN 'mview autovacuum_freeze_max_age'
END reason,
CASE WHEN tot.relkind = 't' THEN parents.tab_schema ELSE tot.tab_schema END tab_schema,
CASE WHEN tot.relkind = 't' THEN 'TOAST of '||parents.relname ELSE tot.relname END tabname,
tot.tab_frozen_age,
tot.force_freeze_age
FROM tab_opts_toasts tot LEFT OUTER JOIN tab_opts_toasts parents ON parents.reltoast = tot.reloid
WHERE tot.force_freeze_age IS NOT NULL and tot.tab_frozen_age >= tot.force_freeze_age::bigint * 0.8

UNION ALL

SELECT
current_database() db,
'SYSTEM autovacuum_freeze_max_age' reason,
CASE WHEN tot.relkind = 't' THEN parents.tab_schema ELSE tot.tab_schema END tab_schema,
CASE WHEN tot.relkind = 't' THEN 'TOAST of '||parents.relname ELSE tot.relname END tabname,
tot.tab_frozen_age,
current_setting('autovacuum_freeze_max_age')::bigint force_freeze_age
FROM tab_opts_toasts tot LEFT OUTER JOIN tab_opts_toasts parents ON parents.reltoast = tot.reloid
WHERE tot.tab_frozen_age >= current_setting('autovacuum_freeze_max_age')::bigint * 0.8
;

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

WARNING__W03009:База данных близка к порогу принудительной заморозки транзакций.
Перед обновлением необходимо предварительно либо выполнить vacuumdb -a -F -v (заморозка транзакций в кластере баз), либо увеличить значение параметра autovacuum_freeze_max_age глобально, исходя из формулы max_frozen_age > 0.8 * autovacuum_freeze_max_age.WARNING

Проверка наличия зависимостей представлений от таблиц/представлений, относящихся к расширениям

SELECT DISTINCT
ext_view.oid::regclass AS extension_obj, -- объект расширения от которого зависим
e.extname AS extension_name, -- имя расширения от которого зависим
dep_view.oid::regclass AS dependent_view, -- зависимое пользовательское представление
current_database() db -- БД в которой нашли зависимость
FROM
pg_depend d1
JOIN pg_extension e ON d1.refclassid = 'pg_extension' ::regclass
AND d1.refobjid = e.oid
JOIN pg_class ext_view ON ext_view.oid = d1.objid
AND ext_view.relkind IN ('v', 'm', 'r', 'p', 'f')
JOIN pg_depend d2 ON d2.refclassid = 'pg_class' ::regclass
AND d2.refobjid = ext_view.oid
AND d2.deptype IN ('n', 'x')
JOIN pg_rewrite r ON r.oid = d2.objid
JOIN pg_class dep_view ON dep_view.oid = r.ev_class
AND dep_view.relkind IN ('v', 'm')
WHERE
NOT EXISTS (
SELECT
1
FROM
pg_depend d3
WHERE
d3.refclassid = 'pg_extension'::regclass
AND d3.objid = dep_view.oid
AND d3.deptype = 'e'
)
ORDER BY
extension_obj,
dependent_view;

Если запрос выведет не пустое значение, будет выведено следующая ошибка:

FAIL__E03111:В БД {} обнаружена зависимость представления {} от таблицы/представления {}, относящегося к расширению {}. Для успешного обновления необходимо устранить данную зависимость.FAIL

Проверка наличия зависимостей представлений от функций, относящихся к расширениям

SELECT DISTINCT
ext_func.oid::regprocedure AS extension_function, -- функция расширения от которой зависим
e.extname AS extension_name, -- имя расширения от которого зависим
dep_view.oid::regclass AS dependent_view, -- зависимое пользовательское представление
current_database() db -- БД в которой нашли зависимость
FROM
pg_depend d1
JOIN pg_extension e ON d1.refclassid = 'pg_extension'::regclass
AND d1.refobjid = e.oid
JOIN pg_proc ext_func ON ext_func.oid = d1.objid
JOIN pg_depend d2 ON d2.refobjid = ext_func.oid
AND d2.deptype IN ('n', 'x')
JOIN pg_rewrite r ON r.oid = d2.objid
JOIN pg_class dep_view ON dep_view.oid = r.ev_class
AND dep_view.relkind IN ('v', 'm')
WHERE
NOT EXISTS (
SELECT
1
FROM
pg_depend d3
WHERE
d3.refclassid = 'pg_extension'::regclass
AND d3.objid = dep_view.oid
AND d3.deptype = 'e'
)
ORDER BY
extension_function,
dependent_view;

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

FAIL__E03112:В БД {} обнаружена зависимость представления {} от функции {}, относящейся к расширению {}. Для успешного обновления необходимо устранить данную зависимость.FAIL

Проверка наличия таблиц, связанных внешним ключом с таблицами, относящихся к расширению

WITH
ext_relations AS NOT MATERIALIZED (
SELECT
e.extname AS extension_name,
nc.nspname AS table_schema,
c.relname AS table_name
FROM
pg_extension e
JOIN pg_depend d ON d.refobjid = e.oid
AND d.deptype = 'e'
JOIN pg_class c ON c.oid = d.objid
AND c.relkind IN ('r', 'p', 'f')
JOIN pg_namespace nc ON nc.oid = c.relnamespace
)
SELECT DISTINCT
tc.table_schema, -- схема пользовательской таблицы с FK
tc.table_name, -- имя пользовательской таблицы
tc.constraint_name, -- имя FK
ccu.table_schema AS foreign_table_schema, -- схема таблицы от которой зависим
ccu.table_name AS foreign_table_name, -- имя таблицы от которой зависим
er.extension_name AS extension_name, -- имя расширения от которого зависим
current_database () db -- БД в которой нашли зависимость
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
-- сразу присоединяем только таблицы расширений
JOIN ext_relations AS er ON er.table_schema = ccu.table_schema
AND er.table_name = ccu.table_name
WHERE
tc.constraint_type = 'FOREIGN KEY'
-- исключаем случаи, когда сама таблица FK — часть расширения
AND NOT EXISTS (
SELECT
1
FROM
ext_relations AS er2
WHERE
er2.table_schema = tc.table_schema
AND er2.table_name = tc.table_name
)
ORDER BY
tc.table_schema,
tc.table_name,
tc.constraint_name;

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

FAIL__E03113:В БД {} обнаружена таблица {}, связанная внешним ключом с таблицей {}, относящейся к расширению {}. Для успешного обновления необходимо устранить данную зависимость.FAIL

Проверка наличия повреждений системного каталога pg_constraint

SELECT pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;',
conrelid::pg_catalog.regclass, conname) AS "drop",
pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;',
conrelid::pg_catalog.regclass, conname,
pg_catalog.pg_get_constraintdef(oid)) AS "add",
current_database() db
FROM pg_catalog.pg_constraint c
WHERE contype = 'f' AND conparentid = 0 AND
(SELECT count(*) FROM pg_catalog.pg_constraint c2
WHERE c2.conparentid = c.oid) <>
(SELECT count(*) FROM pg_catalog.pg_inherits i
WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND
EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table
WHERE partrelid = i.inhparent));

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

WARNING__W03011:В СУБД обнаружены повреждения системного каталога pg_constraint, вызванные некорректной обработкой команд ATTACH/DETACH PARTITION ядрами PostgreSQL до 15.9.
Для устранения повреждений подключиться к БД: {}, удалить сбойные ограничения и добавить корректные, используя команды DROP: {} и ADD: {}.
При добавлении корректного ограничения (команда ALTER TABLE .. ADD CONSTRAINT) могут быть обнаружены данные, нарушающие ограничение.
Такие данные могли быть добавлены при сбойном ограничении. В этом случае исправить данные или ограничение можно только вручную.WARNING

Проверка наличия потерянных записей pg_init_privs

SELECT pg_catalog.format('delete from pg_init_privs pd where pd.objoid = %s and pd.classoid = %s and pd.objsubid = %s and pd.privtype= ''e'';',
p.objoid, p.classoid, p.objsubid) sqlcommand,
current_database() db
FROM pg_init_privs p
WHERE
p.privtype = 'e' AND
classoid = 'pg_class'::regclass AND
NOT EXISTS (SELECT 1 FROM pg_class cl WHERE cl.oid = p.objoid);

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

WARNING__W03012:В СУБД обнаружены потерянные записи pg_init_privs после сбоя при удалении таблицы, связанной с проблемой ядер PostgreSQL до 15.8.
Рекомендуем выполнить их удаление в БД: {} c с помощью команды DELETE: {}.WARNING

Проверка наличия индексов BRIN с фильтрами Блума

SELECT
current_database() as dbname,
n.nspname AS schemaname,
c.relname AS tablename,
i.relname AS indexname,
pg_get_indexdef(i.oid) AS indexdef
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 LIKE '%bloom%' AND opcmethod = am.oid);

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

WARNING__W03018:В СУБД обнаружен индекс BRIN с фильтрами Блума: {}. В связи с неккоректной работой функции brin_bloom_union() в ядрах PostgreSQL 14 индекс может быть разрушен.
Рекомендуем выполнить его удаление и пересоздание по пути (<имя БД>.<имя схемы>.<имя таблицы>): {}.{}.{}. Реконструкция команды пересоздания индекса: {}.WARNING

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

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

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

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

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

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

Проверка отсутствия ссылок, ссылающихся на другие ссылки при создании табличных пространств в БД, а также ссылок, созданных с использованием относительных путей

SELECT
current_database() dbname,
c.connamespace::regnamespace schemaname,
c.conrelid::regclass tablename,
c.conname constraintname,
pg_get_constraintdef(c.oid,true) constraintdef
FROM pg_constraint c JOIN pg_class part ON c.conrelid = part.oid
WHERE
c.contype = 'f' AND
c.conrelid = c.confrelid AND
part.relkind = 'p';

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

WARNING__W03017:В СУБД обнаружен ссылающийся на себя внешний ключ {} в партиционированной таблице.
Рекомендуем выполнить его удаление или пересоздание по пути (<имя БД>.<имя схемы>.<имя таблицы>): {}.{}.{}. Реконструкция раздела описания внешнего ключа: {}.WARNING

Проверка наличия gin индексов

SELECT
current_database() as dbname,
n.nspname AS schemaname,
c.relname AS tablename,
i.relname AS indexname,
pg_get_indexdef(i.oid) AS indexdef
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 = 'gin';

Если запрос выведет не пустое значение, будет выведено следующее предупреждение:

WARNING__W01004:В базе {} обнаружены индексы GIN. У этих индексов различаются внутренние структуры между старой и новой СУБД,
поэтому при обновлении они будут отключены (переведены в состояние invalid).
Будет получен скрипт reindex_gin.sql, в результате выполнения которого эти индексы будут пересозданы.
До этого индексы GIN использовать не получится. Автоматический запуск файла reindex_gin.sql в процессе обновления, регулируется параметром reindexdb_gin_after_pgupgrade в конфигурационном файле.WARNING

Проверка методов аутентификации в СУБД

Скрипт-разведчик выполняет поиск в файле pg_hba.conf неподдерживаемых значений для параметра clientcert.

Если в СУБД используются методы аутентификации более не поддерживаемые версией Pangolin, на которую планируется обновление, будет выведена следующая ошибка:

FAIL__E03008:При аутентификации в СУБД используются {list_of_methods} методы, которые перестанут работать после обновления СУБД, так как отсутствуют в enabled_extra_auth_methods = {enabled_extra_auth_methods}. Приведите все подключения к СУБД в соответствии с перечисленными в enabled_extra_auth_methods или добавьте {list_of_methods} в enabled_extra_auth_methods.FAIL

Где:

  • list_of_methods - список методов аутентификации, присутствующих в СУБД;
  • enabled_extra_auth_methods - список допустимых методов аутентификации.

Проверка наличия неподдерживаемых параметров в конфигурационном файле Pangolin

Скрипт-разведчик выполняет проверку неподдерживаемых параметров в конфигурационном файле postgresql.conf. Если такие параметры найдены, выводится ошибка:

FAIL__E03070:В кандидате на обновление обнаружены неподдерживаемые параметры {list_of_deprecated_parameters} в конфигурационном файле {path_to_config} на хосте {inventory_hostname}. Для корректного обновления необходимо произвести удаление этих параметров.FAIL

Где:

  • list_of_deprecated_parameters - список неподдерживаемых параметров;
  • path_to_config - путь до конфигурационного файла;
  • inventory_hostname - наименование узла стенда.

Проверка значения max_worker_processes

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

Если для параметра max_worker_processes выставлено значение меньше минимально допустимого, будет выведена следующая ошибка:

FAIL__E03009:Минимально допустимое значение для max_worker_processess должно быть >= {needed_value}. Допущена ошибка в конфигурировании max_worker_processess. Измените данный параметр в конфигурационном файле.FAIL

Где inventory_hostname - наименование узла стенда.

Где needed_value - минимально допустимое значение для параметра max_worker_processess.

Проверка отсутствия ссылок при создании табличных пространств в БД

Производится проверка использования ссылок для указания местоположения табличных пространств в БД.

Если подобные ссылки будут обнаружены, будет выведена следующая ошибка:

FAIL__E03105:Обнаружено использование ссылки для указания местоположения табличного пространства в БД. Для работы скриптов обновления в базе данных необходимо указать реальные пути для всех табличных пространств. Допустимые символические ссылки для pg_tablespace_location должны начинаться на: '/pgdata/data' либо '/pgdata/<XX>' (две цифры). Список найденных некорректных путей: {}FAIL

Где list_of_paths - список некорректных путей до табличных пространств.

Проверка отсутствия ссылок, ссылающихся на другие ссылки при создании табличных пространств в БД, а также ссылок, созданных с использованием относительных путей

Проводится проверка использования для указания местоположения табличных пространств в БД символических ссылок, ссылающихся на другие символические ссылки, а также ссылок, созданных с использованием относительных путей.

FAIL__E03115:Обнаружены табличные пространства, location которых содержат неподдерживаемые символические ссылки (символические ссылки, созданные с использованием относительных путей, символические ссылки, ссылающиеся на другие ссылки).
Список найденных ссылок: '{}'.FAIL

Где list_of_paths – список некорректных путей до табличных пространств.

Проверка отсутствия вложенных табличных пространств в БД

Производится проверка вложенных табличных пространств в БД. Каталоги табличных пространств не должны быть размещены в каталогах других табличных пространств.

Если вложенные табличные пространства обнаружены, будет выведена следующая ошибка:

FAIL__E03116:Обнаружены вложенные табличные пространства, location которых являются родительской директорией для каталогов других табличных пространств.
Скорректируйте табличные пространства таким образом, чтобы для каждого location был указан собственный каталог, не являющийся частью пути к каталогу другого табличного пространства.
Список путей родительских табличных пространств в которых обнаружена проблема: '{}'.
Список путей дочерних табличных пространств: '{}'.FAIL

Проверка наличия неподдерживаемых значений параметра clientcert в правилах pg_hba.conf

Скрипт-разведчик выполняет поиск в файле pg_hba.conf неподдерживаемых значений для параметра clientcert.

Если подобные значения будут обнаружены, выводится ошибка:

FAIL__E03071:В кандидате на обновление обнаружены неподдерживаемые параметры {parameter_names} в правилах pg_hba на хосте {inventory_hostname}.
Для корректного обновления необходимо произвести удаление этих параметров.FAIL

Где:

  • parameter_names – список неподдерживаемых параметров;
  • inventory_hostname – наименование узла стенда.

Проверка игнорирования ошибок при обновлении расширений

При заполнении в конфигурационном файле config.yml параметра ext_upd_ignore_errors будет выведено предупреждение пользователю, что обновление не будет прервано, если при обновлении перечисленных в ext_upd_ignore_errors расширений произойдет ошибка:

WARNING__W03019:При обновлении расширений будут проигнорированы ошибки для расширений, указанных в конфигурационном файле в параметре 'ext_upd_ignore_errors'.
Пользователь, выполняющий обновление и заполняющий параметр с перечнем расширений, ошибки в обновлении которых будут проигнорированы, должен также оценить влияние на зависимые расширения от указанных им в параметре.
Любые последствия игнорирования ошибок в обновлении расширений — вплоть до нарушения целостности данных — лежат в ответственности пользователя.
В случае возникновения ошибок при обновлении расширений из данного списка, дальнейшие шаги по устранению последствий и проблем, связанных с игнорированием ошибок при обновлении расширений, а также по корректному обновлению расширений находятся в ответственности пользователя.
Пока расширения не будут успешно обновлены их использование и использование зависимых от них расширений официально не поддерживается.
Список расширений, для которых включено игнорирование ошибок: {}WARNING
Внимание!

Администратор, который проводит обновление, может пополнять параметр ext_upd_ignore_errors любыми расширениями, учитывая следующее:

  • Ответственность за заполнение списка, последствия от игнорирования ошибок обновления расширений и устранение связанных с этим проблем лежит на администраторе СУБД.
  • В случае появления предупреждений об ошибках при обновлении расширений – появляется необходимость проведения администратором процедуры дополнительного обновления расширений. Любые последствия игнорирования ошибок в обновлении расширений из ext_upd_ignore_errors, вплоть до нарушения целостности данных, лежат в ответственности администратора.
  • Несмотря на то, что не обновленные в результате сбоя расширения могут сохранять работоспособность – до корректного обновления этих расширений, их использование официально не поддерживается.

При возникновении ошибок при обновлении любых расширений, кроме timescaledb, указанных в параметре ext_upd_ignore_errors, в журнал обновления выводится сообщение WARNING__W05003, информирующее о проигнорированных ошибках обновления расширения:

WARNING__W05003:При обновлении расширений, указанных в конфигурационном файле в параметре 'ext_upd_ignore_errors' возникли ошибки.
Необходимо ознакомиться с логом и провести ручное обновление расширений. До тех пор пока расширения не будут корректно обновлены их использование официально не поддерживается.
Список расширений, для которых включено игнорирование ошибок: {}
Лог выполнения обновления расширений с опцией игнорирования ошибок:
{}WARNING

При возникновении ошибок при обновлении расширения timescaledb, указанного в параметре ext_upd_ignore_errors, в журнал обновления выводится сообщение WARNING__W05004, информирующее о проигнорированных ошибках обновления расширения:

WARNING__W05004:При обновлении расширения timescaledb возникли ошибки, так как данное расширение указано в конфигурационном файле в параметре 'ext_upd_ignore_errors' они были проигнорированы.
Необходимо ознакомиться с логом и провести ручное обновление расширения. До тех пор, пока расширение не будет корректно обновлено, его использование официально не поддерживается.
Имя БД: {}
Лог выполнения обновления расширения с опцией игнорирования ошибок: {}WARNING

В случае, если при создании резервной копии разрешений расширения pg_stat_kcache, указанного в параметре ext_upd_ignore_errors, возникнут ошибки, сообщение WARNING__W05005 выводит пользователю полный лог создания резервной копии разрешений:

WARNING__W05005:При подготовке расширения pg_stat_kcache к обновлению возникли ошибки при создании dump-файла привилегий, так как данное расширение указано в конфигурационном файле в параметре 'ext_upd_ignore_errors' они были проигнорированы.
Необходимо ознакомиться с логом и провести ручное восстановление привилегий и проверить корректность обновления расширения.
До тех пор, пока расширение не будет корректно обновлено, его использование официально не поддерживается.
Лог создания dump-файла привилегий: {}WARNING

В случае, если при восстановлении разрешений расширения pg_stat_kcache, указанного в параметре ext_upd_ignore_errors, возникнут ошибки, сообщение WARNING__W05006 выводит пользователю полный лог восстановления разрешений из файла резервной копии:

WARNING__W05006:После обновления расширения pg_stat_kcache возникла проблема при восстановлении привилегий из dump-файла для расширений pg_stat_kcache and pg_stat_statements.
Так как расширение pg_stat_kcache указано в конфигурационном файле в параметре 'ext_upd_ignore_errors' - ошибки были проигнорированы.
Необходимо ознакомиться с логом и провести ручное восстановление привилегий и проверить корректность обновления расширения. До тех пор, пока расширение не будет корректно обновлено, его использование официально не поддерживается.
Лог восстановления привилегий из dump-файла: {}WARNING

Проверка наличия пользовательских таблиц со столбцами типа xid

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

FAIL__Обнаружена(ы) таблица(ы) в которой(ых) присутствует(ют) поле(я) с типом xid.
В новой версии СУБД Pangolin применяется 64-битный счетчик транзакций.
Необходимо удалить поле(я) с типом xid в таблице(ах).
Список таблиц, использующих их (<имя таблицы>(<имя колонки>)):
types04.typ_xid(val),
types04.typ_xid(val_arr),
types05fail.typ_pgc_pg_class(val),
types05fail.typ_pgc_pg_class(val),
types05fail.typ_pgc_pg_database(val),
types05fail.typ_pgc_pg_database(val).FAIL

Проверка использования устаревшего параметра GUC alternative_extension_control_directory

При использовании параметра GUC alternative_extension_control_directory на стенде со сторонними расширениями, в журнал обновления выводится сообщение WARNING, информирующее о замене данного параметра на новый extension_control_path:

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

Проверка нестандартных значений для параметра wal_segsize

Осуществляется проверка значения параметра wal_segsize из пользовательского конфигурационного файла.

Если указан несуществующий или недопустимо малый/большой размер сегмента WAL, будет выведено сообщение об ошибки:

FAIL__E01054:Значение '{}' для параметра '{}' некорректно. Необходимо задать степень двойки в диапазоне от 1 до 1024 включительно.FAIL

Если для размера сегмента WAL указано нецелочисленное значение, выводится сообщение об ошибке:

FAIL__E01023:Значение '{}' для параметра '{}' некорректно. Следует указать целое число.FAIL

Проверка наличия изменяемых параметров после автоматизированного обновления

Происходит проверка параметров в конфигурационных файлах postgresql.conf и postgres.yml на предмет изменения их значений по итогам автоматизированного обновления.

Со списком изменяемых параметров можно ознакомиться в разделе «Изменения перечня конфигурационных параметров при обновлении».

По результатам проверки пользователю будет выводиться следующее WARNING-сообщение:

"WARNING__W03033:В процессе обновления будут изменены следующие параметры в конфигурационном файле {}:
{}
С информацию о причинах изменения параметров можно ознакомится в документации в разделе 'Изменения перечня конфигурационных параметров при обновлении'.WARNING"

Проверки для обновления исполняемых файлов

При данном типе обновления выполняются все проверки из блока «Проверки для всех типов обновлению», а также проверки перечисленные далее в данном блоке.

Проверка типа обновления (с обновлением системных данных)

Производится определение типа обновления. Если обновление исполняемых файлов сопровождается запуском скрипта обновления системных данных, будет выведено следующее предупреждение:

WARNING__W03035:Необходимо обновление исполняемых файлов. Процесс обновления исполняемых файлов будет сопровождаться запуском скрипта обновления системных данных. Работа скрипта подразумевает полную недоступность кластера до конца работы сценария.

Проверка типа обновления (без обновления системных данных)

Производится определение типа обновления. Если обновление исполняемых файлов не сопровождается запуском скрипта обновления системных данных, будет выведено следующее предупреждение:

WARNING__W03036:Необходимо обновление исполняемых файлов. Процесс обновления исполняемых файлов не будет сопровождаться запуском скрипта обновления системных данных.

Проверка с помощью утилиты pg_inplace_upgrade

Выполняется проверка с помощью утилиты pangolin-inplace-upgrade.

Если в ходе проверки возможности обновления возникли ошибки, то будет выведено следующее сообщение:

FAIL__E03097:В процессе проверки наличия изменений в системном каталоге возникли ошибки: {error_stdout}. Запуск обновления невозможен.
Перед повторным запуском сценария необходимо изучить список полученных ошибок, причиной может стать некорректная версия каталога или отсутствие прав на рабочие файлы утилиты в каталоге {path_to_catalog}.FAIL

Где:

  • error_stdout – оригинальный текст ошибки утилиты pangolin-inplace-upgrade;
  • path_to_catalog – путь до каталога с рабочими файлами утилиты pangolin-inplace-upgrade.

Проверка наличия физических слотов репликации

Производится проверка наличия физических слотов репликации.

Если будет обнаружен физический слот репликации, который зарезервирован для использования утилитой pangolin-inplace-upgrade, будет выведена следующая ошибка:

FAIL__E03102:На стенде {inventory_hostname} обнаружено использование физической репликации {name_tmp_slot}, которая нужна для корректного выполнения обновления.
Для продолжения обновления требуется удалить данный слот.FAIL

Где:

  • inventory_hostname – наименование узла стенда;
  • name_tmp_slot – наименование физического слота репликации.

Вывод информационных сообщений процесса разведки

Раздел описывает возможные информационные сообщения скрипта-разведчика в случае автоматизированной проверки. При реализации ручного варианта проверки — пропустите данный раздел.

Вывод информационного сообщения о недоступности СУБД

Перед завершением работы скрипта-разведчика будет выведено следующее информационное сообщение:

INFO__I03002:На время обновления база данных будет недоступна.
Обратите внимание при планировании работ.INFO

Удаление каталога для временных файлов

Производится удаление каталога для временных файлов:

{{ local_backup_path }}/scout_temp_data

Вывод информационного сообщения estimation_update_execution_time

При успешном прохождении выше описанных проверок и наличия не пустого значения параметра estimation_update_execution_time в настраиваемом конфигурационном файле выводится информационное сообщение:

INFO__
Оценка времени выполнения обновления СУБД Pangolin с переносом данных по результатам НТ:
а) Standalone конфигурация:
- 144 минуты (100 Gb СУБД Pangolin)
- 293 минуты (250 Gb СУБД Pangolin)
- 578 минут (500 Gb СУБД Pangolin)
- 895 минут (800 Gb СУБД Pangolin)
б) Cluster конфигурация:
- 185 минут (100 Gb СУБД Pangolin)
- 380 минут (250 Gb СУБД Pangolin)
- 741 минута (500 Gb СУБД Pangolin)
- 1148 минут (800 Gb СУБД Pangolin)
Оценка времени выполнения `inplace_upgrade` обновления файлов СУБД Pangolin по результатам НТ:
а) Standalone конфигурация:
- 16 минут (100 Gb СУБД Pangolin)
- 18 минут (500 Gb СУБД Pangolin)
- 18 минут (800 Gb СУБД Pangolin)
б) Cluster конфигурация:
- 34 минут (100 Gb СУБД Pangolin)
- 33 минут (500 Gb СУБД Pangolin)
- 35 минут (800 Gb СУБД Pangolin)
Оценка времени выполнения обновления исполняемых файлов СУБД Pangolin по результатам НТ:
а) Standalone конфигурация:
- 17 минут (100 Gb СУБД Pangolin)
- 17 минут (500 Gb СУБД Pangolin)
- 17 минут (800 Gb СУБД Pangolin)
б) Cluster конфигурация:
- 38 минут (100 Gb СУБД Pangolin)
- 43 минут (500 Gb СУБД Pangolin)
- 45 минут (800 Gb СУБД Pangolin)
Характеристики серверов:
a) Standalone, Active, Standby:
- ОС `Platform V SberLinux OS Server`;
- CPU 16 ядер (Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz);
- RAM 128 Gb;
- Disk HDD 2000 Gb;
- Пропускная способность сети 10Gbit/s.
б) Arbiter:
- ОС `Platform V SberLinux OS Server`;
- CPU 2 ядра (Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz);
- RAM 2 Gb;
- Disk HDD 50 Gb;
- Пропускная способность сети 10Gbit/s.
Сценарий нагрузочного тестирования:
1) Обновление:
- с переносом данных с версии pangolin 5.5.6 до версии pangolin 6.6.0
- inplace_upgrade с версии pangolin 6.1.11 до версии pangolin 6.6.0
- исполняемых файлов с версии 6.4.3 до версии 6.6.0
2) Конфигурация серверов:
- cluster (cluster-patroni-etcd-pgbouncer);
- standalone (standalone-postgresql-pgbouncer).
3) Размер СУБД pangolin:
- 100 GB;
- 250 GB (для обновления с переносом данных);
- 500 GB;
- 800 GB;
4) Процент объема индексов в СУБД pangolin: 30-40%
INFO

Обработка неизвестной ошибки

В случае появления неожиданной ошибки, будет выведена блокирующая выполнение сценария ошибка:

FAIL__E01008:В процессе работы скрипта произошла неожиданная ошибка: {}.
Ознакомьтесь с логами.FAIL

Вывод информационного сообщения с набором действий, которые необходимо произвести после завершения процесса обновления СУБД

По завершению процесса обновления СУБД Pangolin будет выведено информационное сообщение с необходимым набором дальнейших действий. Пример сообщения:

WARNING__W03005:Набор действий, необходимых произвести ПОСЛЕ завершения текущего процесса обновления СУБД:
1) необходимо учесть, что файл recovery.conf более не используются в логике работы СУБД (для кластерной конфигурации)
2) необходимо учесть, что была расширена информация о клиентских сертификатах ssl в представлении pg_stat_ssl и колонка clientdn была переименована в client_dn
3) необходимо учесть, что были изменены параметры хранения и ротации WAL-файлов, параметр wal_keep_segments был объявлен устаревшим, поэтому необходимо перейти на использование параметра wal_keep_size
4) обращаем внимание, что начиная с версии СУБД Pangolin 5.1.0 введено понятие TRUSTED EXTENSIONS, таким образом определенные расширения (список таких расширений можно получить с помощью запроса SELECT DISTINCT name FROM pg_available_extension_versions WHERE TRUSTED ORDER BY name;) в дальнейшем могут быть созданы пользователями с правами CREATE (пользователи входящие в as_admin группу) \
на уровне базы данных
5) необходимо учесть, что в новой версии СУБД Pangolin могли быть изменены некоторые вендорские процедуры, а именно мог измениться состав или порядок аргументов для них (например, функции sec_admin, в которых убран аргумент current_database).
Рекомендация: перед началом обновления версии СУБД необходимо внимательно изучить release notes новой версии.WARNING

Вывод информационного сообщения об успешном завершении сценария проверки

При успешном прохождении выше описанных проверок будет выведено следующее сообщение:

OK__S03001:Разведка перед обновлением успешно выполнена.OK"

Если проверка прошла успешно, то необходимо переходить к процессу обновления.