Проверка готовности к обновлению
Данный раздел описывает процесс проверки готовности экземпляра СУБД Pangolin к обновлению.
Выполнение проверки готовности к обновлению доступно ручным и автоматизированным способом:
- Автоматизированная проверка перед обновлением обусловлена обязательным запуском скрипта-разведчика (
playbook_scouting.yaml), в задачи которого входит выполнение ряда проверок, сбора информации о стенде, а также вычислении типа обновления версии СУБД, необходимого для перехода на новую версию СУБД Pangolin. Все проверки происходит автоматически. В результате проверок могут быть либо выведены предупреждения, и дальнейшее обновление может быть продолжено, либо выведены ошибки, и дальнейшее обновление будет заблокировано. Со всеми возможными проверками, предупреждениями и ошибками можно ознакомиться в разделах далее. - Ручная проверка перед обновлением обусловлена ручным проведением необходимых проверок с помощью представленных рекомендаций в данном разделе. Является обязательным шагом для предотвращения возникновения возможных трудностей непосредственно в процессе обновления.
Подготовительные действия
Отключение сторонних систем резервного копирования
Перед запуском обновления настоятельно рекомендуется отключить все сторонние системы резервного копирования, не входящие в состав дистрибутива Pangolin.
Разблокировка пользователя postgres
Проверки начинаются с разблокировки пользователя postgres в OC и выставления бессрочного пароля на время работы скрипта.
- Автоматизированная проверка
- Ручная проверка
Действия производятся автоматически при работе скрипта-разведчика.
Для того чтобы произвести разблокировку пользователя postgres и выставить бессрочный пароль необходимо выполнить следующие действия:
-
Разблокируйте пользователя
postgresв системе следующей командой:sudo usermod -U postgres -
Установите новый пароль для пользователя
postgresв системе:sudo -i -u postgres -
Обновите пароль пользователя
postgresв СУБД. Для этого подключитесь к БД и выполните следующий SQL-запрос:ALTER USER postgres PASSWORD '<new_pwd>';Где
new_pwd– пароль пользователяpostgres, который был установлен в системе ранее.
Загрузка custom_file_sample.yml и словаря update.yml
- Автоматизированная проверка
- Ручная проверка
Происходит загрузка custom_file_sample.yml и словаря update.yml, содержащего дополнительные переменные с информацией для выводимых сообщений и поддерживаемых расширений. Загрузка происходит в автоматическом режиме при использовании скрипта.
Данные действия предназначены исключительно для автоматизированных процессов и не применяется при реализации ручной проверки.
Запуск автоматизированной проверки готовности к обновлению
Раздел описывает запуск скрипта-разведчика для автоматизированной проверки готовности к обновлению. Пропустите данный шаг при использовании инструмента Pangolin Installer и реализации ручной проверки.
Обязательным условием запуска скриптов обновления СУБД, является запуск скрипта-разведчика (playbook_scouting.yaml).
-
Скачайте и распакуйте дистрибутив новой версии на сервере.
-
Перейдите в каталог с распакованным дистрибутивом, а затем в каталог
installer. -
Перед запуском обновления заполните файл
hosts.iniв зависимости от установленного решения, добавив информацию о хостах и учетных данных пользователя, которые будет использовать Ansible. Данные должны содержать те же параметры, что и при установке.Примеры заполнения файлов описаны в разделе «Сценарий установки при помощи запуска Ansible плейбука».
-
Заполните настраиваемый конфигурационный файл custom_file_sample.yml (пример файла приведен в документе «Конфигурационные файлы для настройки СУБД Pangolin», доступен в личном кабинете).
-
При необходимости в настраиваемом конфигурационном файле заполните список разрешенных файловых систем с помощью параметра
allowed_fs. В случае, если данный параметр не будет заполнен для проверки корректности файловых систем для каталогов, будет использоваться значение по умолчаниюallowed_fs=['ext4']. -
Запустите проверку с использованием Ansible сценария (
playbook_scouting.yaml).Примеры команд для запуска разведчика при работе с различной конфигурацией стенда:
- для конфигурации cluster
- для решения standalone
ansible-playbook playbook_scouting.yaml \
-i inventories/cluster/hosts.ini \
-t always,cluster \
--ask-vault-pass \
-vv \
--extra-vars "local_distr_path=${} \
custom_config=${} \
pangolin_license_path=${}"ansible-playbook playbook_scouting.yaml \
-i inventories/standalone/hosts.ini \
-t always,standalone \
--ask-vault-pass \
-vv \
--extra-vars "local_distr_path=${} \
custom_config=${} \
pangolin_license_path=${}"Описание параметров:
custom_config– абсолютный путь к файлу конфигурацииcustom_file_template.yml;local_distr_path– абсолютный путь к загруженному и распакованному дистрибутиву Pangolin;pangolin_license_path– абсолютный путь к каталогу, где расположены файлы лицензии.
Значения используемых в команде запуска Ansible ключей:
-i– путь к inventory-файла;--extra-vars– переменные, которые по приоритету важнее переменных из inventory;-t– теги для запуска;-v– уровень логирования Ansible. Может быть, как пустым, так и-vvvvvv, где запуск безv– минимальное логирование;--ask-vault-passили--vault-password-file– рассекречивание преобразованных файлов во время выполнения.
Внимание!В случае, если все пароли указывались в открытом виде, параметры
--ask-vault-passи--vault-password-file=название_файла_с_ключомдобавлять не нужно!
Необходимые проверки перед обновлением
В данном разделе представлены проверки, которые производятся в автоматическом режиме скриптом-разведчиком, а также описание проверок для проведения их в ручном режиме.
Проверки делятся на три группы:
-
Проверки для всех типов обновления — включают в себя проверки, которые необходимо изучить/выполнить при любом типе обновления.
- Проверки для обновления с переносом данных — включают в себя проверки, которые необходимо изучить/выполнить только при обновлении с переносом данных, помимо основных проверок (для всех типов).
- Проверки для обновления исполняемых файлов — включают в себя проверки, которые необходимо изучить/выполнить только при обновлении исполняемых файлов, помимо основных проверок (для всех типов).
Проверки для всех типов обновления
Проверка установленной версии Ansible
- Автоматизированная проверка
- Ручная проверка
Производится проверка текущей установленной версии Ansible.
Если текущая версия Ansible меньше поддерживаемой версии, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"FAIL__E01002:Версия установленного ansible: {installed_ansible_version}.
Для работы требуется версия не ниже {min_ansible_version} и не выше {max_ansible_version}.FAIL"
Где:
installed_ansible_version– установленная версия Ansible на стенде;min_ansible_version– минимально необходимая версия Ansible;max_ansible_version– максимально допустимая версия Ansible.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка доступности пакетов продукта
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка всех пакетов СУБД Pangolin. В случае если какой-либо пакет не будет доступен к установке выводится следующая ошибка:
FAIL__E01001:RPM/DEB пакет с версией '{component_version}' компонента '{component_name}' не был найден в 'repo' на хосте {fqdn_host}.FAIL
Где:
component_version- версия компонента;component_name- название компонента;fqdn_host- IP-адрес или fqdn узла стенда.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка возможности скачивания зависимостей, необходимых для корректной работы скриптов автоматизации
- Автоматизированная проверка
- Ручная проверка
Производится проверка возможности скачивания пакетов, необходимых для корректной работы скриптов автоматизации.
Если возникнут проблемы при скачивании пакетов, будет выведена следующая ошибка:
"FAIL__E03028:Обнаружена ошибка во время проверки скачивания {package_manager} пакетов {list_of_packages}.
Проверьте настройку репозиториев.FAIL"
Где:
package_manager– название менеджера пакетов;list_of_packages– список пакетов, которые не удалось скачать.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка поддерживаемых ОС и их версий
- Автоматизированная проверка
- Ручная проверка
Производится проверка типа и версии ОС стенда.
Если СУБД установлена на ОС и/или версии ОС, которая более не поддерживается, будут выведены следующие ошибки:
"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– максимальная версия поддерживаемого дистрибутива.
Необходимо убедиться, что на стенде, который готовится к обновлению, установлена поддерживаемая ОС.
Для это выполните команду:
hostnamectl
Пример ожидаемого вывода:
Static hostname: hostname
Icon name: computer-vm
Chassis: vm
Machine ID: machine-id
Boot ID: boot-id
Virtualization: virtualization
Operating System: SberLinux 9.5 (Katyn)
CPE OS Name: cpe:/o:sberlinux:sberlinux:9::baseos
Kernel: Linux 5.14.0-503.38.1.sl9_5^1.x86_64
Architecture: x86-64
Из вывода выполненной команды сравните значение из параметра Operating System с поддерживаемыми ОС из раздела «Системные требования».
Проверки сетевых имен для узлов стенда
- Автоматизированная проверка
- Ручная проверка
Данные проверки осуществляются, если стенд был настроен с помощью FQDN узлов и был включен параметр used_fqdn_host. По умолчанию данный параметр включен.
-
Производится проверка доступности узлов по сетевому имени. Проверка осуществляет опрос DNS сервера на предмет получения IP-адресов для сетевых имен узлов стенда. Если данная проверка не пройдена, то будет выведена следующая ошибка:
"FAIL__E01043:В кандидате на обновление для хоста {} был определен следующий fqdn {}.
Данный fqdn не прошел проверку доступности.
Такое может быть, когда некорректно настроен DNS-сервер или указано некорректное DNS имя для хоста в /etc/hosts.FAIL" -
Производится проверка соответствия IP-адреса, полученного от DNS сервера и IP-адреса, указанного на узле. В случае неудачи данной проверки будет выведена следующая ошибка:
"FAIL__E01046:В кандидате на обновление для хоста {} определен следующий FQDN {}.
Он не соответствует IP-адресу, полученному с хоста.
Это может быть связано с некорректной настройкой DNS-сервера или неправильным указанием DNS-имени для хоста в /etc/hosts.FAIL"
Данные проверки необходимо выполнить, если в обновляемом кластере используются полные доменные имена в настройке Pangolin Manager и DCS.
Необходимо выполнить следующие команды на каждом узле стенда:
nslookup <fqdn-master>
nslookup <fqdn-replica>
nslookup <fqdn-arbiter>
Где:
fqdn-master– полное доменное имя мастера;fqdn-replica– полное доменное имя реплики;fqdn-arbiter– полное доменное имя арбитра.
После получение ответа от DNS-сервера необходимо сравнить соответствие IP-адресов, указанных на DNS сервере, и IP-адресов самих узлов. IP-адреса должны совпасть.
Для получения IP-адреса на самом узле необходимо выполнить команду ifconfig или ip a.
Проверка файла лицензии
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия и валидности файла лицензии. Проверка валидности проводится с помощью утилиты psql_rsa_verify.
Если файл лицензии не найден, будет выведена ошибка:
"FAIL__E01021:Лицензия, переданная в параметре pangolin_license_path, не найдена.
Для продолжения скорректируйте параметр pangolin_license_path, указав путь до лицензии.FAIL"
Если проверка валидности файла лицензии проходит неудачно, будет выведена следующая ошибка:
"FAIL__E01022:Переданная лицензия невалидная.
{error_stdout}FAIL"
Где error_stdout – вывод результата проверки файла лицензии.
Необходимо выполнить проверку файла лицензии на валидность. Для этого выполните команду:
sudo /usr/bin/psql_rsa_verify <path_to_license>
Где path_to_license – полный путь до файла лицензии.
Пример ожидаемого вывода команды:
Verification is OK
Licensee: Pangolin Autotests
Type: Enterprise
Additional Features:
Data encryption
Auth encryption
Data protection
Configuration protection
Log masking
Certificate PKCS12
Performance insights
Relations block
Object modification date
Connection quota
OutlineQuery
Support 1C
Prepared statements
Native Partitioning
DiagnosticTool
Grace Auth
Resource Consumption Limits
Json Table
Global indexes
Session tracing
Utility psql_set_lsn
Fadvise
WalRecovery checker
Page compression
Set transaction mode
Plan cache lru
Total CPUs: unlimited
Total memory: unlimited
Обратите внимание на строку Verification. В случае действительной лицензии данная строка будет выглядеть следующим образом: Verification is OK.
Проверка 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.
Для проверки наличия Machine ID необходимо выполнить команду:
hostnamectl
В выводе данной команды необходимо убедиться, что поле Machine ID заполнено
Проверка корректности конфигурационного файла
- Автоматизированная проверка
- Ручная проверка
Производится проверка конфигурационного файла postgresql.conf на предмет ошибок заполнения.
Если конфигурационный файл содержит какие-либо ошибки, то выводится сообщение:
"FAIL__E03031:В кандидате на обновление для хоста {inventory_hostname}, в конфигурационном файле postgresql.conf обнаружены ошибки заполнения.FAIL"
Где inventory_hostname – имя узла стенда.
Для проверки корректности заполнения конфигурационного файла postgresql.conf, подключитесь БД и выполните следующий SQL-запрос:
SELECT sourcefile, name, sourceline, error FROM pg_file_settings WHERE error IS NOT null;
Если данный запрос ничего не выведет, то ошибки в конфигурационном файле postgresql.conf отсутствуют, в противном случае необходимо устранить все полученные ошибки.
Проверка поддерживаемой версии для обновления
- Автоматизированная проверка
- Ручная проверка
Производится проверка возможности обновления СУБД с текущей версии, установленной на стенд.
В случае невозможности обновления будет получена ошибка вида:
"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"
Необходимо проверить на что указывает ссылка, располагаемая по пути /usr/pangolin/lib/libconnector_plugin.so.
Для этого выполните команду:
export PANGOLIN_VER=x.x
readlink -f /usr/pangolin-dbms-client-$PANGOLIN_VER/lib/libconnector_plugin.so
Полученный, в ходе выполнения команды путь, не должен быть равен следующему пути /usr/pangolin/lib/plugins/libkms_substitute_plugin.so.
Проверка пароля 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 – путь до временного файла с паролем.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка корректного расположения утилиты secret_storage_client
- Автоматизированная проверка
- Ручная проверка
Для осуществления проверки готовности защищенного хранилища VAULT к последующему обновлению, скрипты используют утилиту secret_storage_client, которая входит в состав дистрибутива.
Утилита расположена в папке installer/utilities/secret_storage_client_bundle/bin/. При отсутствии утилиты будет выведено предупреждающее сообщение (процесс работы скриптов при этом не останавливается):
"WARNING__W03002:Не обнаружена утилита secret_storage_client. Проверки готовности защищенного хранилища VAULT к обновлению будут пропущены.WARNING"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка наличия конфигурационного файла VAULT
- Автоматизированная проверка
- Ручная проверка
Выполняется поиск конфигурационного файла для подключения к VAULT. При отсутствии файла будет выведено сообщение:
"FAIL__E03066:В кандидате на обновление не обнаружен конфигурационный файл '{path_to_config}' для подключения к VAULT.
Проверьте состояния стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.FAIL"
Где path_to_config – пути до конфигурационного файла для подключения к VAULT.
Если подключено VAULT хранилище необходимо убедиться в наличии конфигурационного файла enc_connection_settings.cfg. Чтобы в этом убедиться, выполните следующую команду:
ls /etc/pangolin-security-utilities/enc_connection_settings.cfg
Ожидаемый вывод:
/etc/pangolin-security-utilities/enc_connection_settings.cfg
Проверка наличия успешного подключения к защищенному хранилищу VAULT
- Автоматизированная проверка
- Ручная проверка
Выполняется попытка подключения к VAULT с помощью утилиты setup_kms_credentials. При невозможности подключиться к VAULT будет выведено сообщение вида:
"FAIL__E03067:Не удалось обнаружить ни одного успешного подключения к защищенному(ым) хранилищу(ам) VAULT.
В результате возникли ошибки: {error_stdout}.
Проверьте состояние стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.FAIL"
Где error_stdout – вывод ошибки в результате выполнения команды setup_kms_credentials show --plain.
Проверку необходимо произвести при наличии включенных СЗИ.
Проверьте корректность подключения к VAULT хранилищу. Для этого выполните команду на основном узле под суперпользователем:
/opt/pangolin-security-utilities/bin/setup_kms_credentials show --plain
Пример ожидаемого вывода команды:
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| # | protocol | host | port | root CA path | suffix | prefix | namespace | cred type | auth point | id | status |
-----+----------+-------------+------+------------------+------------+--------+-----------+----------------------+------------+-----------------+----------------
| 0 | https | <ip-vault> | 8200 | /pg_ssl/root.crt | postgresql | kv | | Userpass Auth Method | userpass | adminencryption | Ok |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
Где ip-vault – IP-адрес Vault сервера.
Получение общего списка параметров из защищенного хранилища VAULT
- Автоматизированная проверка
- Ручная проверка
Выполняется попытка получения параметров из защищенного хранилища. В случае возникновения ошибок будет получено сообщение вида:
"FAIL__E03060:В процессе получения списка параметров из защищенного хранилища VAULT возникли ошибки: '{error_stdout}'.
Причиной может быть отсутствие конфигурационного файла '{path_to_config}' с параметрами подключения к защищенному хранилищу VAULT.
Произведите проверку состояние подключения к VAULT серверу(ам) и повторите запуск скрипта разведчика.FAIL"
Где:
error_stdout– вывод ошибки в результате выполнения команды./secret_storage_client --config;path_to_config– путь до конфигурационного файла для подключения к VAULT.
Проверку необходимо выполнять при наличии включенных СЗИ.
Проверьте корректность подключения к VAULT хранилищу. Для этого выполните следующую команду под пользователем postgres:
<path_to_dir>/secret_storage_client --config
Где path_to_dir - полный путь до каталога с бинарным файлом secret_storage_client. По умолчанию данный путь - /home/postgres/installer_cache_dir/secret_storage_client_bundle/bin/.
Пример ожидаемого вывода:
secure_config|||VST_ONLY_VAULT|||present|||on:::password_encryption|||VST_ONLY_VAULT|||present|||scram-sha-256:::ssl|||VST_ONLY_VAULT|||present|||on:::allowed_servers|||VST_ONLY_VAULT|||present|||:::sec_admin_default_auth|||VST_ONLY_VAULT|||present|||scram-sha-256:::pg_ident_conf|||VST_BOTH|||absent|||:::is_tde_on|||VST_ONLY_VAULT|||present|||on:::password_policies_enable|||VST_ONLY_VAULT|||present|||on:::password_policy.deny_default|||VST_ONLY_VAULT|||present|||off:::password_policy.reuse_time|||VST_ONLY_VAULT|||present|||365 days:::password_policy.in_history|||VST_ONLY_VAULT|||present|||4:::password_policy.max_age|||VST_ONLY_VAULT|||present|||0:::password_policy.min_age|||VST_ONLY_VAULT|||present|||0:::password_policy.grace_login_limit|||VST_ONLY_VAULT|||present|||0:::password_policy.grace_login_time_limit|||VST_ONLY_VAULT|||present|||3 days:::password_policy.expire_warning|||VST_ONLY_VAULT|||present|||7 days:::password_policy.lockout|||VST_ONLY_VAULT|||present|||on:::password_policy.lockout_duration|||VST_ONLY_VAULT|||present|||24 hours:::password_policy.max_failure|||VST_ONLY_VAULT|||present|||6:::password_policy.failure_count_interval|||VST_ONLY_VAULT|||present|||0:::password_policy.check_syntax|||VST_ONLY_VAULT|||present|||on:::password_policy.min_length|||VST_ONLY_VAULT|||present|||16:::password_policy.illegal_values|||VST_ONLY_VAULT|||present|||on:::password_policy.alpha_numeric|||VST_ONLY_VAULT|||present|||3:::password_policy.min_alpha_chars|||VST_ONLY_VAULT|||present|||0:::password_policy.min_special_chars|||VST_ONLY_VAULT|||present|||1:::password_policy.min_uppercase|||VST_ONLY_VAULT|||present|||1:::password_policy.min_lowercase|||VST_ONLY_VAULT|||present|||0:::password_policy.max_rpt_chars|||VST_ONLY_VAULT|||present|||0:::password_policy.track_login|||VST_ONLY_VAULT|||present|||0:::password_policy.max_inactivity|||VST_ONLY_VAULT|||present|||0:::password_policy.use_password_strength_estimator|||VST_ONLY_VAULT|||present|||on:::password_policy.password_strength_estimator_score|||VST_ONLY_VAULT|||present|||3:::password_policy.custom_function|||VST_ONLY_VAULT|||present|||:::password_policy.allow_hashed_password|||VST_ONLY_VAULT|||present|||on:::psql_encrypt_password|||VST_ONLY_VAULT|||present|||on:::encrypt_new_tablespaces|||VST_ONLY_VAULT|||present|||ddl:::test_vst_both_restart_only|||VST_BOTH|||absent|||:::test_vst_both_reload_restart|||VST_BOTH|||absent|||:::password_policy.transport_password_mark_automatic|||VST_ONLY_VAULT|||present|||off:::password_policy.transport_password_life_time|||VST_ONLY_VAULT|||present|||0:::performance_insights.masking|||VST_ONLY_VAULT|||present|||on:::masking_mode|||VST_ONLY_VAULT|||present|||disabled:::nonrestorable_deletion|||VST_ONLY_VAULT|||absent|||:::nonrestorable_wal_deletion|||VST_ONLY_VAULT|||absent|||:::integrity_check_delay|||VST_ONLY_VAULT|||absent|||:::integrity_check_wait|||VST_ONLY_VAULT|||absent|||:::integrity_check_select_wait|||VST_ONLY_VAULT|||absent|||:::loading_control.check_allow_list|||VST_ONLY_VAULT|||absent|||:::loading_control.check_hash|||VST_ONLY_VAULT|||absent|||:::enabled_extra_auth_methods|||VST_ONLY_VAULT|||present|||cert:::enabled_sec_admin_extra_auth_methods|||VST_ONLY_VAULT|||present|||cert:::enable_vault_params_cache|||VST_ONLY_VAULT|||absent|||:::enable_vault_certificates_cache|||VST_ONLY_VAULT|||absent|||:::vault_cache_expiration_at_fault|||VST_ONLY_VAULT|||absent|||:::vault_cache_expiration_timeout|||VST_ONLY_VAULT|||absent|||
Получение списка параметров говорит о том, что подключение до VAULT хранилища работает и проблем не наблюдается. В противном случае необходимо убедиться в наличии конфигурационного файла enc_connection_settings.cfg (по умолчанию располагается в /etc/postgres/enc_connection_settings.cfg) и устранить проблемы с подключением к 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"
Проверку необходимо выполнять при наличии включенных СЗИ.
-
Выполните команду для получения значения параметра
secure_config, установленного в БД (под пользователемpostgres):psql -c "SHOW secure_config;" -
Получите список всех параметров из VAULT хранилища командой:
<path_to_dir>/secret_storage_client --configГде
path_to_dir- полный путь до каталога с бинарным файломsecret_storage_client. По умолчанию данный путь -/home/postgres/installer_cache_dir/secret_storage_client_bundle/bin/. -
Найдите параметр
secure_configи сравните его значение со значением из первого пункта. Они должны совпадать.В случае, если значения параметров не совпадают, проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного ID на сервере VAULT.
Проверка корректного значения для параметра 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
Проверку необходимо выполнять при наличии включенных СЗИ.
-
Выполните команду для получения значения параметра
is_tde_on, установленного в БД (под пользователемpostgres):psql -c "SHOW is_tde_on;" -
Получите список всех параметров из VAULT хранилища командой:
<path_to_dir>/secret_storage_client --configГде
path_to_dir- полный путь до каталога с бинарным файломsecret_storage_client. По умолчанию данный путь -/home/postgres/installer_cache_dir/secret_storage_client_bundle/bin/. -
Найдите параметр
is_tde_onи сравните его значение со значением из первого пункта. Они должны совпадать.В случае, если значения параметров не совпадают, проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного ID на сервере VAULT.
Проверка идентичности значений pg_ident на защищенном хранилище VAULT и в локальном конфигурационном файле
- Автоматизированная проверка
- Ручная проверка
Сравниваются значения pg_ident в защищенном хранилище и локальном конфигурационном файле. Значения параметра в обоих случаях должны быть одинаковыми, в противном будет получено сообщение вида:
"FAIL__E03065:Значение параметра pg_ident в защищенном хранилище VAULT должно соответствовать значению в локальном конфигурационном файле '{path_to_dir}/pg_ident.conf'.
Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT.
Затем повторите запуск скрипта разведчика.FAIL"
Где path_to_dir – путь до директории в конфигурационном файле.
Проверку необходимо выполнять при наличии включенных СЗИ.
-
Выполните команду (под пользователем
postgres) для получения значения параметраpg_identиз конфигурационного файлаpg_ident.conf:cat /pgdata/07/data/pg_ident.conf | grep pg_ident -
Получите список всех параметров из VAULT хранилища командой:
<path_to_dir>/secret_storage_client --configГде
path_to_dir- полный путь до каталога с бинарным файломsecret_storage_client. По умолчанию данный путь -/home/postgres/installer_cache_dir/secret_storage_client_bundle/bin/. -
Найдите параметр
pg_identи сравните его значение со значением из первого пункта. Они должны совпадать.В случае, если значения параметров не совпадают, проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного ID на сервере VAULT.
Проверка типа используемоего хранилища VAULT
- Автоматизированная проверка
- Ручная проверка
В случае использования защищенного хранилища OneKey для обновляемой версии Pangolin 6.5.2 будет выведено предупреждение о невозможности выполнения автоматического отката в процессе обновления:
WARNING__W03015:В случае возникновения ошибки в процессе обновления автоматический откат к исходной версии будет невозможен ввиду использования нестандартной версии утилиты 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– оригинальный текст ошибки подключения.
Необходимо убедиться, что подключение к БД выполняется без каких-либо проблем.
Для этого выполните подключение к БД на мастере и на реплике, и выполните следующий SQL-запрос:
SELECT now();
Если в процессе подключения к БД возникли какие-либо проблемы, их необходимо устранить.
Проверка наличия записей в 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"
Необходимо проверить отсутствие/наличие записей postgres в cron.
Для этого выполните команду:
cat <path_to_file> | grep postgres
Где path_to_file – полный путь до конфигурационных файлов cron, а именно:
/etc/cron.allow– конфигурационный файл cron со списком пользователей, которым разрешено выполнение задач с помощью cron. В случае наличия данного файла, УЗpostgresв нем должна существовать./etc/cron.deny– конфигурационный файл cron со списком пользователей, которым запрещено выполнение задач с помощью cron. В случае наличия данного файла, УЗpostgresв нем должна отсутствовать.
Проверка наличия задержки между узлами
- Автоматизированная проверка
- Ручная проверка
Выполняется получение значения задержки между мастером и репликой и сравнение этого значения с допустимым значением из пользовательского конфигурационного файла.
Если задержка между мастером и репликой будет превышать допустимое значение, установленное в кастомном конфигурационном файле (по умолчанию данное значение равно 100 мб), то будет выведена ошибка:
"FAIL__E03082:В кандидате на обновление обнаружен недопустимый объем lag: {current_lag}.
Для продолжения обновления нужно синхронизировать кластер до максимального объема lag {max_lag}.FAIL"
Где:
current_lag– текущая задержка между мастером и репликой;max_lag– пороговое значение задержки.
Проверку необходимо произвести в случае кластерной конфигурации.
Необходимо проверить наличие задержки между мастером и репликой.
Для этого на мастере под пользователем postgres выполните команду:
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list <clustername>
Где clustername – имя кластера
Пример ожидаемого результата:
+ Cluster: clustername (cluster-id) -----------------+--------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+-----------------------+----------------------------+--------------+-----------+----+-----------+
| srv-ip-1 | srv-ip-1:5433 | Leader | running | 3 | |
| srv-ip-2 | srv-ip-2:5433 | Sync Standby | streaming | 3 | 0 |
+-----------------------+----------------------------+--------------+-----------+----+-----------+
Обратите внимание на колонку Lag in MB. Оптимальным считается минимальное значение данного показателя.
Максимально рекомендуемое значение задержки между мастером и репликой при обновлении с переносом данных – 100 Мбайт, при обновлении системных каталогов – 0 Мбайт.
Проверка прослушивания портов
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка того, что сервисы обновляемого стенда прослушивают необходимые порты на узле.
Если проверка закончится неудачей, будет выведена следующая ошибка:
"FAIL__E03106:Сервис {service_name} не прослушивает ни один из портов.
Проверьте состояние сервиса или настройки конфигурационного файла.FAIL"
Где service_name – имя службы.
Необходимо проверить, что прослушиваются все необходимые порты, используемые в работе СУБД.
Для этого на каждом узле экземпляра СУБД выполните следующую команду суперпользователем:
ss -tulpn | grep <port>
Где port – номер порта, который должен прослушиваться.
Проверка состояния параметра 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"
Убедитесь в отсутствии включенного параметра KillUserProcesses в файле /etc/systemd/logind.conf.
Для этого на каждом узле стенда выполните команду:
cat /etc/systemd/logind.conf | grep KillUserProcesses
Параметр KillUserProcesses должен быть закомментирован, либо быть в состоянии no.
Проверка отсутствия неудачных попыток обновления
- Автоматизированная проверка
- Ручная проверка
Скрипт осуществляет проверку предыдущих обновлений и фиксирует неудачные попытки.
Если предыдущие попытки обновления были неуспешными, либо, если при неудачном обновлении был некорректно произведен автоматический откат, то скрипт прервется и создаст файл /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, указанного в файле inventory, и фактического указания роли master на стенде.
В случае, если мастер не соответствует переданному в конфигурации hosts.ini, скрипт прервется с ошибкой:
"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__W03015:На стенде используется неподдерживаемая конфигурация {} с использованием Pangolin DCS. Необходимо актуализировать параметр installer.cluster_type в конфигурационном файле СУБД.WARNING
Данное сообщение не блокирует обновление, но настоятельно рекомендуется скорректировать параметр installer.cluster_type так как в будущих версиях обновление с подобным расхождением типа используемой конфигурации и фактически используемых компонентов будет невозможно.
-
Выполните проверку установленного типа конфигурации в параметре
installer.cluster_typeв конфигурационном файлеpostgres.yml:cat /etc/pangolin-manager/postgres.yml | grep installer.cluster_type -
Определите тип используемого распределенного хранилища конфигурации.
-
Если используется модуль Pangolin DCS, скорректируйте значение параметра
installer.cluster_typeв конфигурационном файлеpostgres.ymlнаcluster-patroni-dcs-pgbouncer. Описание данного процесса представлено ниже.
Процесс актуализации кластерной конфигурации
Действия выполняются на мастере и на реплике поочереди.
-
В конфигурационном файле
/etc/pangolin-manager/postgres.ymlизменить значение параметраinstaller.cluster_typeнаcluster-patroni-dcs-pgbouncer. -
Перечитать конфигурационный файл
postgres.ymlи перезагрузить СУБД с помощью следующих команд:sudo su - postgres
reload
restart -
Проверить что конфигурация на узле успешно изменилась:
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/07). Требуется минимум 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"
Необходимо проверить количество свободного места в точке монтирования PGBACKUP (пример: /pgarclogs/07).
Для этого выполните следующие команды:
# Получение информации о точках монтирования в директории
mount | grep '<path_to_dir>'
# Получение информации о занятом пространстве для точки монтирования
df -h <path_to_mpoint>
Где:
path_to_dir– полный путь до каталогаPGBACKUPpath_to_mpoint– полный путь до точки монтирования
Для точки монтирования PGBACKUP необходимо не менее 1 Гбайт свободного пространства.
Проверка свободного места для точки монтирования 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– необходимый объем свободного пространства в точке монтирования.
Необходимо убедиться в достаточном количестве свободного пространства в точках монтирования, в которых расположены следующие каталоги:
/usr/;pgdata;PGBACKUP;PGLOGS.
Необходимо по 1 Гбайт свободного пространства для точек монтирования в которых расположены каталоги:
pgdata;PGBACKUP;PGLOGS.
Необходимо не менее 2 Гбайт свободного пространства для точки монтирования, в которой находится каталог /usr/.
Проверка свободного места для PGDATA на реплике
- Автоматизированная проверка
- Ручная проверка
Производится проверка свободного места в каталоге $PGDATA на реплике.
Если на реплике для $PGDATA недостаточно места, то будет выведена следующая ошибка:
"FAIL__E03043:Недостаточно свободного места в точке монтирования для pgdata на реплике ({replica_hostname}) для выполнения обновления.
Доступно свободного места {current_free_space} Мбайт, требуется {needed_free_space} МбайтFAIL"
Где:
replica_hostname– имя реплики из inventory файла;current_free_space– текущий объем свободного места;needed_free_space– необходимый объем свободного места.
Проверку необходимо произвести в случае кластерной конфигурации.
Необходимо убедиться в том, что на реплике достаточно свободного места в каталоге PGDATA.
Для этого выполните следующие действия:
-
Определите размер каталога
PGDATAна мастере командой:du -sk <path_to_pgdata> | awk '{print $1}'Где
path_to_pgdata– полный путь до каталогаPGDATA. -
Определите необходимое количество свободного пространства для каталога
PGDATAна реплике, необходимое для обновления. Рассчитайте необходимое пространство по формуле:need_size_pgdata_replica = size_pgdata_master * 2 / 1024Где:
size_pgdata_master– размер каталогаPGDATAна мастере;need_size_pgdata_replica– расчетное значение необходимого пространства для каталогаPGDATAна реплике.
-
Определите точку монтирования, в которой расположен каталог
PGDATA, и выясните имеющееся количество свободного места с помощью команды:df -h <path_to_mount>Где
path_to_mount– полный путь до точки монтирования. -
Сравните расчетное значение необходимого пространства, полученное в пункте 2, и свободное место точки монтирования из пункта 3.
В случае если места на точке монтирования недостаточно, перед началом обновления его необходимо увеличить.
Проверка наличия свободного места для точек монтирования, содержащих табличные пространства
- Автоматизированная проверка
- Ручная проверка
Производится проверка свободного места для табличных пространств.
Если для табличных пространств недостаточно места, то будет выведена следующая ошибка:
"FAIL__E03044:Недостаточно свободного места в точке монтирования {mount_name} для выполнения обновления.
Доступно свободного места {current_free_space} Мбайт, требуется {needed_free_space} МбайтFAIL"
Где:
mount_name– название точки монтирования;current_free_space– текущий объем свободного места;needed_free_space– необходимый объем свободного места.
Необходимо проверить достаточно ли свободного места в точках монтирования, содержащих табличные пространства.
Для этого выполните следующие действия:
-
Получите список всех табличных пространств PostgreSQL с помощью команды:
psql -c "SELECT spcname FROM pg_tablespace;" -
Для каждого табличного пространства получите путь к каталогу, в котором оно расположено, с помощью команды:
psql -c "SELECT spclocation FROM pg_tablespace WHERE spcname = 'tablespace_name';".Где
tablespace_name– имя табличного пространства. -
Для каждого каталога получите список точек монтирования, в которых он расположен.
-
Для каждой точки монтирования получите информацию о свободном месте с помощью команды:
df -h <path_to_mpoint>Где
path_to_mpoint– полный путь до точки монтирования. -
Рассчитайте необходимое количество свободного пространства по формуле:
<current_tablespace_size> * 1.01Где
current_tablespace_size– текущее размер табличного пространства. -
Сравните количество свободного места, в пункте 4, с расчетным.
В случае если текущего количества свободного места в точках монтирования недостаточно, перед обновлением необходимо расширить пространство для этих точек монтирования.
Проверка наличия точек монтирования в рабочем каталоге PGDATA
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия точек монтирования в рабочем каталоге PGDATA.
Если в рабочем каталоге PGDATA были обнаружены точки монтирования, будет выведена следующая ошибка:
"FAIL__E03072:В кандидате на обновление обнаружены точки монтирования в рабочем каталоге /pgdata: {mount_name}.
Размонтируйте найденные каталоги для дальнейшего обновления.FAIL"
Где mount_name – название точки монтирования.
Проверьте наличие точек монтирования в рабочем каталоге PGDATA.
Для этого выполните команду:
mount | grep <path_to_catalog>
Где path_to_catalog – полный путь до рабочего каталога PGDATA.
Если точки монтирования будут обнаружены, перед началом обновления их необходимо размонтировать.
Проверка точек монтирования
- Автоматизированная проверка
- Ручная проверка
Производится проверка прав для записи в каталоги, которые могут быть точками монтирования – PGDATA, PGBACKUP и PGLOGS.
Если скриптам развертывания не удается выполнить запись в данные каталоги, то выводится ошибка:
"FAIL__E01013:Инсталлятор не может записать файлы в директорию {dir_path}.
Проверьте маску директории или назначьте владельца postgres.FAIL"
Где dir_path – полный путь до директории.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка консистентности виртуальных сред
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия виртуальных сред по путям, указанным в конфигурационном файле, а также консистентности установленных библиотек в данных виртуальных окружениях.
В случае, если виртуального окружения не существует или в нем отсутствует какая-либо из зависимостей, будет выведено сообщение:
"FAIL__E03075:Не найдена директория со старой версий virutalenv в директории PGHOME на хосте: {inventory_hostname}.
Для корректной проверки установите из дистрибутива rpm пакет pangolin-ansible-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 – полный путь до директории.
Необходимо убедиться, что для каталогов PGDATA, PGBACKUP пользователь postgres имеет полные права.
Для этого необходимо выполнить следующие команды под пользователем postgres:
# Просмотр каталога PGDATA, PGBACKUP
ls <path_to_catalog>
# Создание тестового файла в каталогах PGDATA, PGBACKUP
touch <path_to_catalog>/test
# Удаление тестового файла в каталогах PGDATA, PGBACKUP
rm -f <path_to_catalog>/test
Где path_to_catalog – полный путь до каталогов PGDATA, PGBACKUP.
Если какая-то из команд не была выполнена, значит у пользователя postgres не хватает прав доступа. Перед обновлением необходимо выдать данному пользователю все права на каталоги PGDATA, PGBACKUP.
Проверка корректного местоположения каталога для сохранения локальной резервной копии
- Автоматизированная проверка
- Ручная проверка
Производится проверка каталога для сохранения локальной резервной копии.
Если в параметре 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 - абсолютный путь до расположения файла службы.
Проверьте состояние служб СУБД Pangolin. Для этого на всех узлах экземпляра СУБД выполните следующую команду от имени суперпользователя:
#если сервис был запущен от имени суперпользователя
systemctl status <service_name>
Где service_name – имя службы.
В выводе команды обратите внимание на раздел Loaded, в нем указано местоположение файла службы.
Местоположение файлов служб для всех служб должно быть одинаковое.
В стандартных конфигурациях список служб для узлов следующий:
-
Мастер, реплика:
pangolin-dbms(для конфигурацииstandalone);pangolin-pooler;pangolin-manager(для конфигурацииcluster);etcd(если был установлен).
-
Арбитр:
pangolin-manager/etcd.
Проверка корректности расположения служб, при включенной функциональности «Отказ от root» в процессе эксплуатации
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка местоположения служб текущей версии Pangolin.
Если какая-либо служба будет находиться в системном каталоге служб, в то время, как все остальные находятся в пользовательском каталоге, будет выведена следующая ошибка:
"FAIL__E03078:Служба {service_list} находится в системном каталоге служб, так как другие компоненты находятся в пользовательской директории служб.
Для продолжения мигрируйте сервисный файл в директорию пользователя.FAIL"
Где service_list – список сервисов, находящихся в системном каталоге служб.
Данная проверка выполняется только в случае включенной функциональности «Отказ от root».
Необходимо убедиться, что все службы находятся в пользовательском каталоге.
Для этого выполните команду под пользователем postgres для каждой службы, использующейся в СУБД:
systemctl status --user <service_name>
Где service_name – название службы.
Проверка состояния служб
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка состояния служб текущей версии СУБД Pangolin.
Если какая-либо служба, необходимая для корректной работы СУБД, выключена, то будет выведена следующая ошибка:
"FAIL__E03079:Служба {service_name} не запущена. Проверьте состояние серисаFAIL"
Где service_name – название службы.
Проверьте состояние служб СУБД Pangolin. Для этого на всех узлах экземпляра СУБД выполните следующую команду от имени суперпользователя:
#если сервис был запущен от имени суперпользователя
systemctl status <service_name>
#если сервис был запущен от пользователя postgres
su - postgres
systemctl status --user <service_name>
Где service_name – имя службы.
В стандартных конфигурациях список служб для узлов следующий:
-
Мастер, реплика:
pangolin-dbms(для конфигурацииstandalone);pangolin-pooler;pangolin-manager(для конфигурацииcluster);etcd(если был установлен).
-
Арбитр:
pangolin-manager/etcd.
Проверка структуры каталогов PGDATA
- Автоматизированная проверка
- Ручная проверка
Скрипт запрашивает структуру каталогов на active и standby для кластерной конфигурации.
Если структура каталогов отличается, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"FAIL__E03036:Разная структура каталогов в каталоге pgdata на серверах.
Структура pgdata должна быть одинаковой на мастере и реплике.
Со структурой можно ознакомиться в логе задачи (имя таски: pgdata directory structure).FAIL"
Необходимо убедиться в идентичности структуры каталогов PGDATA на мастере и на реплике.
Для этого выполните следующие действия:
-
Получите структуру каталога
PGDATAна мастере и на реплике с помощью следующей команды:find <path_to_pgdata> -type dГде
path_to_pgdata– полный путь до каталогаPGDATA. -
Сравните полученные структуры друг с другом, они должны быть одинаковые.
Проверка символических ссылок в PGDATA
- Автоматизированная проверка
- Ручная проверка
Скрипт запрашивает на active и standby список всех символических ссылок в каталоге PGDATA и определяет куда они направлены.
Если символические ссылки отличаются, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"FAIL__E03037:Отличаются символические ссылки в каталоге pgdata на серверах.
Приведите символические ссылки к целевому виду.
Со списком символических ссылок можно ознакомиться в логе задачи (имя таски: symlinks in pgdata).FAIL"
При обработке ошибки необходимо перейти в лог выполнения задачи и поиском найти задачу symlinks in pgdata. В задаче распечатана информация для анализа различий.
Необходимо убедиться, что на мастере и на реплике в каталоге PGDATA присутствуют идентичные символические ссылки.
Для этого на основном узле и узле репликации выполните следующую команду (от имени суперпользователя):
find <path_to_pgdata> -type l
Где path_to_pgdata – полный путь до каталога 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: "'adminpack', '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_trgm', 'pg_visibility', 'pgcrypto', 'pgrowlocks', 'pgstattuple', 'plperl', 'plperlu', 'plpgsql', 'pltcl', '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_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', 'plantuner'"
Расширения (pg_background, postgis, 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"
Перед обновлением необходимо убедиться, что в СУБД не используются неподдерживаемые в новой версии дистрибутива расширения.
Список поддерживаемых расширений смотрите в документе «Описание расширений продукта СУБД Pangolin».
Для проверки наличия неподдерживаемых расширений выполните следующие действия:
-
Подключитесь к каждой БД и выполните следующий SQL-запрос для поиска расширений, не входящих в список поддерживаемых:
SELECT format('<db_name>.%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_of_extension>);Где:
db_name– имя БД, к которой было выполнено подключение;list_of_extension– список поддерживаемых расширений.
-
Проверьте наличие неподдерживаемых расширений в конфигурационном файле СУБД. Для этого получите список расширений, указанный в параметре `shared_preload_libraries, и убедитесь, что в нем отсутствуют расширения не из списка:
cat <path_to_config> | grep shared_preload_librariesГде
path_to_config– полный путь до конфигурационного файлаpostgresql.confилиpostgres.yml
При выполнении обновления с переносом данных в случае обнаружения неподдерживаемых расширений, их необходимо удалить.
Проверка статуса состояния снятия РК (только для промышленной эксплуатации)
- Автоматизированная проверка
- Ручная проверка
Проверяется статус снятия РК через представление backup.history.
При получении значения статуса, отличного от failed, complited или waiting_from_wal_backup, будет выведена ошибка, блокирующая выполнение сценария:
"FAIL__E03092:Обновление невозможно, так как активна сессия снятия РК внешней службой.
Дождитесь окончания снятия РК со стендаFAIL"
Необходимо убедиться в отсутствии активного процесса снятия резервной копии. Для этого подключитесь к базе и выполните следующий SQL-запрос:
SELECT state FROM backup.history ORDER BY start_time DESC LIMIT 1;
При получении значения статуса, отличного от failed, complited или waiting_from_wal_backup необходимо дождаться окончания снятия РК со стенда.
Проверка наличия каталога для временных файлов
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия каталога для временных файлов.
{{ local_backup_path }}/scout_temp_data
В случае отсутствия каталога будет выведена следующая ошибка:
"FAIL__E03014:Не найден каталог {}, указанный в качестве каталога для создания локального резервного копирования. Создайте каталог.FAIL"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка минимальной конфигурации CPU и RAM на обновляемых стендах
- Автоматизированная проверка
- Ручная проверка
Проверка осуществляется путем сбора системных параметров стенда и сравнения с минимальными значениями, указанными в файле конфигурации custom_file_template.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– минимально допустимое количество оперативной памяти, Гбайт.
Необходимо убедиться в соответствии стенда минимальным системным требованиям для обновления.
Системные требования следующие:
-
Для узлов СУБД:
- CPU – 4;
- RAM – 8 Гбайт.
-
Для узла арбитра:
- CPU – 1;
- RAM – 1.
Получить значения CPU и RAM на самих узлах можно с помощью команд:
# получение количества ядер CPU
nproc
# Получение информации об оперативной памяти
free -h
Проверка достаточного количества оперативной памяти необходимой для обновления
- Автоматизированная проверка
- Ручная проверка
Проводится проверка достаточного количества оперативной памяти необходимой для обновления.
Если оперативной памяти будет недостаточно, то будет выведена следующая ошибка:
"FAIL__E03034:В кандидате на обновление обнаружен недостаток свободной оперативной памяти.
Для успешного выполнения операции разведки и последующего обновления shared_buffers тестовой базы необходимо не менее {need_ram} ГБ или не менее {need_percent_ram}% свободной оперативной памяти.
Сейчас доступно {free_ram} ГБ.__FAIL"
Где:
need_ram– необходимое количество свободной оперативной памяти, Гбайт;need_percent_ram– процент необходимой свободной оперативной памяти;free_ram– текущее количество свободной оперативной памяти.
Необходимо проверить количество свободной оперативной памяти.
Для этого выполните команду:
free -h
Обратите внимание на столбцы total и available. Если общее количество оперативной памяти меньше 64 Гбайт, то для обновления необходимо минимум 4 Гбайт свободной памяти, иначе - 8 Гбайт.
Проверка достаточного количества больших страниц (huge_pages)
- Автоматизированная проверка
- Ручная проверка
Проводится проверка достаточного количества больших страниц, необходимых для успешного обновления.
Если больших страниц будет недостаточно, то будет выведена следующая ошибка:
"FAIL__E03114:При разведке обнаружено, что не хватает свободных страниц для работы с HugePages.
Необходимое число страниц для корректной работы базы: {huge_pages_recomended_number}.
Текущее число страниц, установленное в операционной системе: {huge_pages_total}.
Рекомендуется отключить поддержку больших страниц в базе на время обновления или увеличить число больших страниц, выделяемых операционной системой, выше минимально рекомендуемого.FAIL"
Где:
huge_pages_recomended_number– рекомендованное минимальное число больших страниц с учетом запаса безопасности;huge_pages_total– текущие число больших страниц, сконфигурированное на стенде;
-
Необходимо проверить, включены ли большие страницы, и количество используемых больших страниц операционной системой.
Для этого выполните команду:
cat /proc/sys/vm/nr_hugepagesЛюбое число, отличное от
0будет свидетельствовать о включенных больших страницах. -
Если число отличается от
0, то необходимо проверить, включена ли поддержка больших страниц в экземпляре СУБД.Для этого выполните запрос:
show huge_pages;Если результат запроса, равен
onилиtry, то считается, что экземпляр СУБД может использовать большие страницы, и следует перейти к следующему шагу. -
Необходимо проверить число свободных больших страниц. Для этого выполните команду:
cat /proc/meminfo | grep 'HugePages_Free'Запомните это число, с ним следует проверить результат выполнения следующей команды.
-
Проверьте текущее необходимое минимальное необходимое число больших страниц для корректной работы будущего экземпляра БД. Предварительно для этого необходимо выполнить запрос:
show shared_buffers;Результаты выполнения запроса необходимо подставить в следующую команду вместо
show_shared_buffers, a{{ local_backup_path }}по умолчанию считать равным/pgarclogs:{{ local_backup_path }}/scout_temp_data/install_dbms/bin/postgres --shared-buffers={{ show_shared_buffers }} -D {{ local_backup_path }}/scout_temp_data/pgdata -C shared_memory_size_in_huge_pages 2>/dev/nullРезультат выполнения этой команды выведет число используемых будущим экземпляром СУБД больших страниц. Добавьте к нему значение
{{ shared_buffers.safety_extra_huge_pages }}(по умолчанию равно 10) и сравните с результатом проверки числа свободных больших страниц. Если число свободных больших страниц больше числа необходимых больших страниц для запуска нового экземпляра СУБД, то проверка выполнена успешно.
Проверка одинаковой конфигурации узлов мастера и реплики
- Автоматизированная проверка
- Ручная проверка
Проверка осуществляется путем сбора системных параметров мастера и реплики и сравнение их друг с другом.
Если проверка обнаружила несоответствие, будет выведена ошибка:
"FAIL__E03049:Количество ядер CPU на мастере не соответствует количеству ядер CPU на реплике.FAIL"
"FAIL__E03050:Количество оперативной памяти на мастере не соответствует количетву оперативной памяти на реплике.FAIL"
Необходимо убедиться, что на мастере и на реплике одинаковые системные характеристики в части количества ядер CPU и оперативной памяти.
Для этого выполните следующие команды на мастере и на реплике:
-
Получение информации о количестве ядер CPU:
nproc -
Получение общего количества оперативной памяти (обратить внимание на столбец
total):free -h -
Сравните полученные значения количества ядер.
Проверка наличия установленных пакетов 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"
Проверку необходимо произвести в случае кластерной конфигурации.
Необходимо убедиться что компоненты pangolin-dbms и pangolin-dbms-client на мастере и на реплики одной версии. Для этого необходимо:
-
При обновлении с версии без пакета для компонента
pangolin-dbms-client, выполните команду:yum list installed | grep platform-v-pangolin-dbms (для rpm-based систем)
dpkg -l | grep platform-v-pangolin-dbms (для deb-based систем)Пример ожидаемого вывода:
platform-v-pangolin-dbms.x86_64 <version>-sberlinux9 @@commandlineГде
version– версия компонента. -
При обновлении с версии для которой пакет для компонента
pangolin-dbms-clientесть, выполните команды:yum list installed | grep pangolin-dbms # для rpm-based систем
dpkg -l | grep pangolin-dbms # для deb-based системПример ожидаемого вывода:
pangolin-dbms-<version>.x86_64 <version>-sberlinux9 @@commandline
pangolin-dbms-<version>-client.x86_64 <version>-sberlinux9 @@commandlineГде
version– версия компонента.
Проверка наличия необходимых компонентов на всех узлах стенда
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия всех необходимых компонентов на всех узлах стенда.
Если проверка наличия необходимых компонентов не пройдена, будет выведена следующая ошибка:
"FAIL__E03002:На узлах не совпадет тип развертывания для компонента {name_of_component}.
Для продолжения обновления необходимо, чтобы наличие компонента и его версия совпадали на всех узлах.FAIL"
Если не пройдена проверка наличия одинаковых версий компонентов на всех узлах стенда, будет выведена следующая ошибка:
"FAIL__E03003:На узлах обнаружены различные версии компонента {name_of_component}.
Для продолжения обновления необходимо, чтобы версии компонента на всех узлах совпадали.FAIL"
Где name_of_component – название проблемного компонента.
Проверку необходимо произвести в случае кластерной конфигурации.
Необходимо проверить, что на мастере и на реплике установлены следующие компоненты:
pangolin-manager;pangolin-pooler;pangolin-backup-tools.
В случае отсутствия какого-либо из указанных компонентов, перед обновлением необходимо его установить на проблемном узле.
Проверка возможности обновления компонента pangolin-backup-tools
- Автоматизированная проверка
- Ручная проверка
Производится проверка возможности обновления компонента pangolin-backup-tools.
Если проверка не пройдена, будет выведена следующая ошибка:
"FAIL__E03004:Обновление компонента 'pangolin-backup-tools' невозможно, ввиду некорректной предыдущей установки.FAIL"
Проверку необходимо произвести при использовании СРК на стенде.
Убедитесь в наличии необходимых рабочих файлов для компонента pangolin-backup-tools.
Список рабочих файлов:
manage_backup.sh;pangolin_archlogs.sh;manage_backup.bin.
Чтобы убедиться в наличии необходимых файлов выполните следующую команду под суперпользователем:
find / -name '<filename>'
Где filename – имя файла из списка. Если какого-то файла не будет хватать, необходимо устранить данную проблему.
Проверка наличия конфигурационных файлов компонента 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. Для этого выполните команду:
ls /etc/pangolin-backup-tools/backup-tools-env
Конфигурационный файл для компонента должен присутствовать на стенде.
Проверка соответствия настроек pangolin-backup-tools на узлах кластера
- Автоматизированная проверка
- Ручная проверка
Производится проверка соответствия настроек компонента pangolin-backup-tools между узлами кластера.
Если настройки pangolin-backup-tools не соответствуют друг другу на мастере и на реплике, будет выведена следующая ошибка:
"FAIL__E03057:Обнаружено несоответствие настроек компонента 'pangolin-backup-tools' на нодах кластера.
Необходимо привести состяния стенда на всех нодах к одному состоянию.FAIL"
Проверку необходимо произвести в случае кластерной конфигурации.
Необходимо убедиться, что компонент pangolin-backup-tools установлен и на мастере и на реплике. Для этого выполните следующие действия:
-
В случае установки компонента
pangolin-backup-toolsс помощью пакетного менеджера, выполните следующую команду:yum list installed | grep pangolin-backup-tools (для rpm-based систем)
dpkg -l | grep pangolin-backup-tools (для deb-based систем) -
В случае установки компонента
pangolin-backup-toolsбез помощи пакетного менеджера, необходимо убедиться в наличии каталога с исполняемыми файлами внутри. Для этого выполните команду:ls -la /opt/omni/lbin/
В случае отсутствия компонента pangolin-backup-tools на мастере или реплике, необходимо подставить данный компонент на проблемный узел перед началом обновления.
Проверка наличия рабочих файлов для утилиты 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– название компонента.
Проверку необходимо произвести при использовании СРК на стенде.
Убедитесь в наличии необходимых рабочих файлов для компонента pangolin-backup-tools.
Список рабочих файлов:
manage_backup.sh;pangolin_archlogs.sh;manage_backup.bin.
Чтобы убедиться в наличии необходимых файлов выполните следующую команду под суперпользователем:
find / -name '<filename>'
Где filename – имя файла из списка. Если какого-то файла не будет хватать, необходимо устранить данную проблему.
Проверка наличия необходимых параметров в рабочем файле утилиты pangolin-backup-tools
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия необходимых параметров в рабочем файле компонента pangolin-backup-tools.
Если в рабочем файле не будут обнаружены необходимые параметры, а именно:
PGINSTANCE;WALSTATE_FILE;LOG_FILE.
Будет выведена следующая ошибка:
"FAIL__E03091:На узле '{inventory_hostname}' для компонента '{name_of_component}' в процессе проверки содержимого рабочего файла '{path_to_config}' не удалось обнаружить следующие значения в нем: '{name_of_parameters}'.
Произведите проверку содержимого фалйла и добавьте недостающие значения.FAIL"
Где:
inventory_hostname– наименование узла стенда;name_of_component– название компонента;path_to_config– полный путь до рабочего файла;name_of_parameters– название необходимых параметров.
Проверка производится при наличии СРК на стенде.
Необходимо убедиться, что в рабочих файлах компонента pangolin-backup-tools присутствуют следующие параметры:
PGINSTANCE;WALSTATE_FILE;LOG_FILE.
Для этого выполните следующие команды:
cat <path_to_work_file> | grep 'PGINSTANCE'
cat <path_to_work_file> | grep 'WALSTATE_FILE'
cat <path_to_work_file> | grep 'LOG_FILE'
Где path_to_work_file – полный путь до рабочих файлов:
pangolin_archlogs.sh;manage_backup.sh.
Проверка корректности установки расширения 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.
Проверка производится при наличии расширения pg_cron.
Необходимо убедиться в корректности установки данного расширения. Для этого выполните следующие действия:
-
Проверить, что расширение
pg_cronне установлено в БДtemplate0. Для этого выполните команду:cat <path_to_config> | grep 'cron.database_name'Где
path_to_config– полный путь до конфигурационного файлаpostgresql.conf. -
Проверить, что расширение
pg_cronустановлено только для одной БД указанной в конфигурационном файле. Для этого необходимо подключиться к каждой БД и выполнить следующий SQL-запрос:SELECT extname FROM pg_catalog.pg_extension ex JOIN pg_namespace ns ON ex.extnamespace=ns.oid WHERE ex.extname='pg_cron';Если в какой-либо БД, кроме указанной в конфигурационном файле, будет обнаружено, что установлено расширение
pg_cron, его необходимо удалить из данной БД.
Проверка корректности работы СУБД с засекреченным хранилищем
- Автоматизированная проверка
- Ручная проверка
Если была включена функциональность засекречивания паролей, то для проверки ее корректной работы под пользователем postgres выполняется следующая команда:
/bin/pg_auth_config check
При не успешном прохождении проверки будет выведена следующая ошибка:
"FAIL__E03045:Не прошла проверка доступа к базе данных с использованием засереченного хранилища паролей (pg_auth_config check), на стенде {inventory_hostname}. Ознакомьтесь с логами.FAIL"
Где inventory_hostname – наименование узла стенда.
Если на стенде включена функциональность засекречивания паролей, необходимо проверить корректность работы с засекреченным хранилищем.
Для этого под пользователем postgres выполните следующую команду:
/bin/pg_auth_config check
Пример ожидаемого вывода:
Connection settings for host: "localhost", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "localhost", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "localhost", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "localhost", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "localhost", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "127.0.0.1", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Connection settings for host: "<ip-addr>", port "<port>", database "<db_name>", user "<username>" are OK
Где:
ip-addr– IP-адрес/FQDN узла стенда;port– порт для подключения к БД;db_name– имя базы данных;username– имя пользователя БД.
Если в выводе будет обнаружено, что не все подключения прошли успешно, перед началом обновления необходимо устранить возникшие проблемы.
Проверка каталога исполняемых файлов в кластере СУБД Pangolin
- Автоматизированная проверка
- Ручная проверка
Скрипт-разведчик выполняет сравнение каталогов с исполняемыми файлами на всех хостах с СУБД Pangolin.
Если каталоги отличаются, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__E03077:Зафиксировано несоответствие директории {path_to_dir} между узлами кластера.
Необходимо произвести их корректировкуFAIL"
Где path_to_dir – путь до проблемной директории.
Проверку необходимо произвести в случае кластерной конфигурации.
Необходимо проверить, что в файле .bash_profile пользователя postgres содержатся одинаковые переменные и их значения. Необходимо убедиться в наличии следующих переменных:
PGHOME_CLIENT– путь до каталога с клиентской частью СУБД;PGHOME– полный путь до каталога установки СУБД.
Для проверки наличия данных переменных и получения их значений, выполните под пользователем postgres, на каждом узле стенда, следующие команды:
echo $PGHOME_CLIENT
echo $PGHOME
Полученные значения необходимо сравнить между всеми узлами стенда. В случае, если значения не совпадут, на проблемном узле необходимо скорректировать путь до каталога или переместить сам каталог.
Проверка корректности установки расширения pg_profile
- Автоматизированная проверка
- Ручная проверка
Производится проверка корректности установки расширения pg_profile.
Если расширение pg_profile установлено в некорректную схему БД, будет выведена следующая ошибка:
"FAIL__E03018:Обновление невозможно. Расширение 'pg_profile' должно быть установлено в схеме 'pgse_profile'.
Текущее значение: {name_of_schema}. FAIL"
Где name_of_schema – имя текущей схемы, в которой установлено расширение pg_profile.
Данная проверка производится, если установлено расширение pg_profile.
Необходимо убедиться, что данное расширение установлено в корректную схему. Для этого подключитесь к БД, для которой установлено расширение, и выполните следующий SQL-запрос:
SELECT format('%1$s',nspname) extname FROM pg_catalog.pg_extension ex JOIN pg_namespace ns ON ex.extnamespace =ns.oid WHERE (ex.extname='pg_profile');
Если в результате выполнения запроса обнаружено, что расширение установлено не в схему pgse_profile, необходимо перед началом обновления это исправить.
Проверки расширения timescaledb
- Автоматизированная проверка
- Ручная проверка
Производятся проверки расширения timescaledb.
-
Если на стенде установлена версия расширения
timescaledb, неподдерживаемая в новой версии Pangolin, будет выведена следующая ошибка:FAIL__E03085:Обновление с установленным расшрением timescaledb версии {current_version} не поддерживается.
Необходимо обновить расширение до версии {needed_version}.
Если поднятие версии расширения не представляется возможным, необходимо произвести промежуточное обновление СУБД до версии 6.5.2.FAIL"
FAIL__E03110: Обновление с установленным расшрением timescaledb версии {current_version} невозможно.
Необходимо произвести обновление до минимальной версии 6.1.7 или 6.3.0FAILГде:
current_version– текущая версия расширенияtimescaledb;needed_version– необходимая версия расширенияtimescaledb;
-
Если на стенде установлено расширение
timescaledbс неподдерживаемой лицензией, будет выведена следующая ошибка:"FAIL__E03086:В БД используется расширение timescaledb с неподдерживаемой лицензией {type_of_license}.FAIL"Где
type_of_license– тип лицензии текущего расширенияtimescaledb.
Если используется расширение timescaledb, то необходимо убедиться что его версия/лицензия поддерживается в новой версии СУБД. В противном случае необходимо будет произвести обновление данного расширения до обновления самой СУБД, либо, в случае обновления системных каталогов, произвести обновление на промежуточную версию СУБД.
Чтобы проверить, поддерживается ли установленная версия расширения timescaledb в новом дистрибутиве СУБД, необходимо:
-
Получить текущую версию расширения
timescaledb. Для этого подключитесь к каждой БД, где используется данное расширение, и выполните следующие SQL-запросы:SELECT extversion FROM pg_extension WHERE extname = 'timescaledb'; -- для получения версии установленного расширения
SELECT name, reset_val FROM pg_settings WHERE name ~ 'timescaledb.license'; -- для получения типа лицензии расширения -
Получить версию расширения
timescaledbиз нового дистрибутива.rpm -qi <path_to_extension> (для rpm-based систем)
dpkg -s <path_to_extension> (для deb-based систем)Где
path_to_extension– полный путь до пакета расширенияtimescaledbиз нового дистрибутива. По умолчанию данный пакет находится в3rdparty/timescaledb. -
Убедитесь что текущая версия расширения совпадает с версией из нового дистрибутива. В противном случае необходимо перед обновлением СУБД, обновить данное расширение.
-
Убедитесь, что тип лицензии расширения, полученный в пункте 2, не равен
apache. В противном случае необходимо переустановить данное расширение с поддерживаемым типом лицензии.
Проверка возможности обновления расширения anon
- Автоматизированная проверка
- Ручная проверка
Производится проверка версии расширения anon на предмет возможности его обновления.
Если обновление данного расширения не поддерживается, будет выведена следующая ошибка:
"FAIL__E03104:Версии расширения anon из дистрибутива и БД: {current_version} не совпадают.
Обновление расширения не поддерживается.FAIL"
Где current_version – текущая версия расширения anon.
Необходимо убедиться, что версия расширения anon, установленная в СУБД соответствует версии расширения из нового дистрибутива.
Для этого выполните следующие действия:
-
Получите версию текущего расширения
anon. Подключитесь к БД и выполните следующий SQL-запрос:select extversion from pg_extension where extname = 'anon'; -
Узнайте версию расширения, используемую в новой версии дистрибутива. Выполните следующую команду:
rpm -qi <path_to_extension> (для rpm-based систем)
dpkg -s <path_to_extension> (для deb-based систем)Где
path_to_anon_rpm– полный путь до пакета расширенияanonиз нового дистрибутива, по умолчанию данный пакет находится в3rdparty/pg_anon. -
Сравнить полученные из пунктов 1 и 2 версии. Если версии расширения не совпадают, то перед обновлением необходимо сначала поднять версию расширения
anon.
Проверка корректности заполнения параметра shared_preload_liraries в конфигурационном файле
- Автоматизированная проверка
- Ручная проверка
Производится проверка корректности заполнения параметра shared_preload_liraries в конфигурационном файле.
Если параметр shared_preload_liraries заполнен некорректно, будет выведена следующая ошибка:
"FAIL__E03107:Обнаружено некорректное заполнение параметра shared_preload_libraries в конфгурационном файле postgresql.conf.
Строка со значением параметра shared_preload_libraries в конфигурационном файле postgresql.conf не может заканчиваться запятой.FAIL"
Необходимо убедиться в корректности заполнения параметра shared_preload_liraries в конфигурационном файле.
Для этого выполните команду:
cat <path_to_config> | grep 'shared_preload_liraries'
Где path_to_config – полный путь до конфигурационного файла СУБД.
Полученная строка не может заканчиваться запятой, в противном случае необходимо скорректировать заполнение данного параметра.
Проверка соответствия информации об узлах кластера в конфигурационном файле и на самих узлах
- Автоматизированная проверка
- Ручная проверка
Производится проверка соответствия между DNS записями узлов в конфигурационном файле СУБД и DNS записями на самих узлах.
Если в конфигурационном файле обнаружено несоответствие DNS записей с узлами кластера, будет выведена следующая ошибка:
"FAIL__E03087:В конфигурационном файле {path_to_config} на хосте {inventory_hostname}, присутствует несоответствие DNS записей с хостами кластераFAIL"
Где:
path_to_config– путь до конфигурационного файла;inventory_hostname– наименование узла стенда.
Если в настройке кластера используются полные доменные имена узлов, необходимо убедиться в том, что в конфигурационном файле postgres.yml используются корректные FQDN узлов.
Проверка наличия дубликатов параметров в конфигурационном файле
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия дублирующих параметров в конфигурационном файле postgres.yml.
Если в конфигурационном файле pangolin-manager обнаружены дубликаты параметров, будет выведена следующая ошибка:
"FAIL__E03010:В файле {path_to_config}/postgres.yml найдены параметры: {list_of_parameters}, имеющие дубли.
Удалите дубликаты параметров из конфигурационного файла.FAIL"
Где:
path_to_config– полный путь до директории с конфигурационным файлом;list_of_parameters– список дублирующихся параметров.
Если стенд находится в кластерной конфигурации, то необходимо убедиться в отсутствии дубликатов в конфигурационном файле postgres.yml.
Для этого выполните команду:
cat <path_to_config> | sort |uniq -d
Где path_to_config – полный путь до конфигурационного файла.
Если данная команда вернет непустое значение, необходимо удалить дубликаты данных параметров.
Проверка наличия unicode символов в конфигурационных файлах
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия unicode символов в следующих конфигурационных файлах:
pg_hba.conf;postgresql.conf;postgres.yml(при кластерной конфигурации).
Если подобные символы будут обнаружены, то будет выведена следующая ошибка:
"FAIL__E03032:В файле {path_to_config} найден символ unicode. Необходимо скорректировать конфигурационный файл.FAIL"
Где path_to_config – полный путь до конфигурационного файла.
Необходимо убедиться, что в конфигурационных файлах отсутствуют unicode символы. Список конфигурационных файлов:
pg_hba.conf;postgresql.conf;postgres.yml(при кластерной конфигурации).
Для этого выполните команду на мастере и реплике под суперпользователем:
file -i <path_to_file>
Где path_to_file – полный путь до перечисленных ранее конфигурационных файлов.
В выводе команды необходимо найти строку charset и убедиться что ее значение не равно utf-8.
В случае если конфигурационные файлы с unicode символами будут обнаружены, их необходимо скорректировать удалив/заменив unicode символы на поддерживаемые.
Проверка наличия 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.
Необходимо проверить не превышает ли количество созданных табличных пространств, значение параметра disk_check_tablespaces_count.
Для этого выполните следующее:
-
Получите количество созданных табличных пространств. Подключитесь к БД и выполните SQL-запрос:
SELECT COUNT(spcname) FROM pg_tablespace WHERE spcname NOT LIKE 'pg_%'; -
Получите значение параметра
disk_check_tablespaces_count, указанного в конфигурационном файле. На мастере выполните команду:grep disk_check_tablespaces_count <path_to_config>Где
path_to_config– полный путь до конфигурационного файла СУБД. -
Сравните значения из первого и второго пункта.
Рекомендуется настроить значение параметра disk_check_tablespaces_count исходя из формулы: disk_check_tablespaces_count = количество имеющихся табличных пространств + 32.
Проверка наличия настроек SSL в конфигурационном файле
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия параметров настройки SSL в конфигурационном файле.
Если в конфигурационном файле параметры не обнаружены, будет выведена следующая ошибка:
"FAIL__E03068:Обновление невозможно, так как не удалось обнаружить параметры {parameter_names} в локальном конфигурационном файле баз данных {path_to_config}.
Приведите файл в актуальное состояние, добавив необходимые настроечные параметры SSL и повторите запуск скрипта разведчика.FAIL"
Где:
parameter_names– список параметров, которые не удалось обнаружить;path_to_config– полный путь до конфигурационного файла.
Если для СУБД настроено использование SSL или PKCS#12 сертификатов для аутентификации, то необходимо убедиться в корректности их настройки в конфигурационном файле postgresql.conf (либо postgres.yml в случае кластерной конфигурации).
В конфигурационном файле должны быть указаны и корректно заполнены следующие параметры:
-
Если настроено использование pkcs12:
serverssl.pkcs12_config_path: <path_to_p12_config>.
Где
path_to_p12_config– полный и актуальный путь до конфигурационного файла. По умолчанию используется путь/pg_ssl/intermediate/server.p12.cfg. -
Если настроено использование ssl:
ssl_key_file– полный и актуальный путь до приватного ключа ssl;ssl_cert_file– полный и актуальный путь до файла сертификата.
Проверка состояния близости БД к порогу заморозки транзакций 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:База данных близка к порогу принудительной заморозки транзакций.
Перед обновлением необходимо предварительно либо выполнить vacuumdb -a -F -v (заморозка транзакций в кластере баз), либо увеличить значение параметра autovacuum_freeze_max_age глобально,
исходя из формулы max_frozen_age > 0.8 * autovacuum_freeze_max_age.WARNING
Где list_of_tables – список таблиц, для которых необходимо увеличить значение параметра autovacuum_freeze_max_age.
Необходимо проверить каждую БД к порогу заморозки транзакций autovacuum_freeze_max_age.
Для этого подключитесь к каждой БД и выполните следующий SQL-запрос:
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
;
Если по результатам запроса будет получен не пустой ответ, то необходимо выполнить следующие действия на выбор:
-
Выполнить заморозку транзакций в кластере баз. Для этого необходимо на мастере под пользователя
postgresвыполнить следующую команду:vacuumdb -a -F -v -
Для указанных таблиц увеличить значение параметра
autovacuum_freeze_max_ageглобально, исходя из формулыmax_frozen_age > 0.8 * autovacuum_freeze_max_age.
Проверка количества транзакций с незавершенным статусом
- Автоматизированная проверка
- Ручная проверка
Скрипт-разведчик выполняет поиск строк с незавершенным статусом транзакции.
Если количество подобных транзакций превышает 3,15 млн будет выведено предупреждение:
WARNING__W03008:Обнаружены базы данных с большим количеством транзакций с незавершенным статусом.
Рекомендуется выполнить следующую команду перед запуском обновления: vacuumdb -F -v -d db_name (запуск очистки базы данных ), где db_name - имя БД из списка.
Список БД: {list_of_databases}.WARNING"
Где list_of_databases – список баз данных, в которых обнаружено большое количество незавершенных транзакций.
Пороговое количество транзакций определено исходя из максимального количества записей, которые могут содержаться в одном журнале и количества самих журналов (эмпирически определено как три).
Необходимо убедиться в том, что в БД присутствует небольшое количество транзакций с незавершенным статусом.
Для этого подключитесь к каждой БД и выполните следующий SQL-запрос:
WITH data_dir AS (
SELECT setting AS path
FROM pg_settings
WHERE name = 'data_directory'
),
files AS (
SELECT pg_ls_dir(path || '/pg_xact') AS fname
FROM data_dir
),
count AS (
SELECT count(*) AS file_count FROM files
)
SELECT
current_database() AS dbname,
(file_count > 3) AS clog_too_large
FROM count;
Если в результате выполнения запроса значения колонки clog_too_large примет значение t, то для данной БД, перед обновлением необходимо выполнить следующую команду:
vacuumdb -F -v -d <db_name>
Где db_name – имя БД, в которой обнаружено большое количество транзакций с незавершенным статусом.
Проверка наличия 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- список привилегий, которые отсутствуют у роли для данного объекта.
Необходимо убедиться что в СУБД для расширений отсутсвуют объекты с некорректными правами доступа.
Для этого выполните следующий 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;
Если результат запроса будет не пустой, значит в СУБД присутствуют объекты к некорректными правами. Необходимо проанализировать вывод работы скрипта и скорректировать права для объектов полученных в результате работы SQL-скрипта.
Описание колонок вывода:
db- Название текущей базы данных;extname- Имя расширения, к которому относится объект;objtype- Тип объекта базы данных (например, 'table', 'view', 'function' и т.д.);objidentity- Уникальный идентификатор или имя объекта;role_actor- Имя роли, для которой проверяются привилегии;unsufficient_privileges- Список привилегий, которые отсутствуют у роли для данного объекта.
Проверки перед обновлением СУБД 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, необходимо убедиться, что версии зависимостей соответствуют минимальным.
Проверка, что в текущей БД и при текущем пользователе схема, в которой создано расширение PostGIS включено в search_path (иначе остальные расширения не могут быть загружены, они не найдут типы данных и spatial_ref_sys)
- Автоматизированная проверка
- Ручная проверка
Происходит поиск и добавление схемы в search_path для расширений.
В случае непрохождения проверки будет выведено сообщение следующего формата:
"FAIL__E03118:Текущая база данных содержит расширение PostGIS в схеме, не отраженной в search_path.
Производные расширения и объекты не могут использовать типы данных PostGIS.
Для продолжения необходимо включить схему, в которой установлено расширение PostGIS, в search_path текущей базы данных.
Найденный объекты: {}.FAIL"
Необходимо найти и добавить схемы в search_path для расширений. Пример команды:
ALTER USER postgres set search_path=public,tiger,topology
Проверка, что пользователь не внес свои SRID, несовместимые с PostGIS и блокирующие установку
- Автоматизированная проверка
- Ручная проверка
Происходит поиск и замена несовместимых SRID на допустимые, либо происходит удаление таких объектов.
В случае непрохождения проверки будет выведено сообщение следующего формата:
"FAIL__E03119:Текущая база данных {} содержит расширение PostGIS со справочником SRID, несовместимым с обновляемой версией.
Для продолжения необходимо удалить найденные объекты из БД. Найденный объекты: {}.FAIL"
Необходимо найти и заменить несовместимый SRID на допустимый, либо удалить такие объекты.
Проверка возможности обновления стенда с выбранным режимом работы утилиты 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"
Нужно удалить невалидные значения из параметра two_phases_extensions в custom_config_initial.yml.
Проверка изменений функций расширений
- Автоматизированная проверка
- Ручная проверка
При обновлении могут возникать предупреждения (WARNING). Они не блокируют процесс обновления, но сигнализируют о том, что в схеме расширений PostGIS или PgRouting изменяются функции. Это может повлиять на работу прикладного кода, использующего эти функции, поэтому такие предупреждения необходимо учитывать при планировании обновления.
- Проверка изменений функций расширения PostGIS:
WARNING-сообщение
"WARNING__W03013:Обновление расширения 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__W03014:Обновление расширения 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"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверки для обновления с переносом данных
При данном типе обновления выполняются все проверки из блока «Проверки для всех типов обновлению», а также проверки перечисленные в данном блоке.
Запуск процесса заморозки
- Автоматизированная проверка
- Ручная проверка
Перед началом обновления, с помощью скриптов автоматизации, будет произведен запуск процесса VACUUM FREEZE, что приведет к заморозке всех блоков данных, не входящих в карту заморозки. Параллельно будет сброшен каждый обработанный блок. Данное действие выполняется для минимизации последствий, вызванных изменением счетчика транзакций на версиях 6.x.x.
Будет выведено одно из следующих предупреждений:
-
Будет запущен процесс очистки (если значение параметра
vacuum_freeze_before_update: trueили оставлено значение по умолчанию):"WARNING__W03011:Перед обновлением СУБД будет запущен VACUUM FREEZE.
Он заморозит все данные, которые не были заморожены пользователем при подготовке стенда к обновлению, что потенциально может привести к отставанию реплики, инцидентам производительности и переполнениям ФС.
Перед обновлением рекомендуется настроить параметр vacuum_freeze_process.timeout с учетом длительности технологического окна и размера незамороженных таблиц.
Для минимизации негативных последствий рекомендуется запустить процесс заморозки непосредственно перед обновлением, в режиме отсутствия транзакционной нагрузки на СУБД.
Пример команды заморозки: 'vacuumdb -F -a -j <количество потоков>' .WARNING" -
Процесс очистки не будет запущен (был изменен параметр
vacuum_freeze_before_updateна значениеfalse):"WARNING__W03012:Процесс VACUUM FREEZE не будет запущен перед обновлением СУБД, что потенциально может привести к потере данных.
Настоятельно рекомендуется установить значение параметра vacuum_freeze_before_update в 'true' в кастомном конфигурационном файле.
А так же настроить параметр vacuum_freeze_process.timeout с учетом длительности технологического окна и размера незамороженных таблиц.
Кроме того, для минимизации негативных последствий рекомендуется запустить процесс заморозки непосредственно перед обновлением, в режиме отсутствия транзакционной нагрузки на СУБД.
Пример команды заморозки: 'vacuumdb -F -a -j <количество потоков>' .WARNING" -
Если произойдет истечение тайм-аута, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"FAIL__E05024:Операция VACUUM FREEZE не успела завершиться - истек тайм-аут.
После отката выполните заморозку таблиц вручную, на узле мастера командой 'vacuumdb -F -a -j <количество потоков>' или увеличьте тайм-аут в конфигурационном файле в переменной vacuum_freeze_process.timeout.
После этого повторите попытку обновления. Текущее значение тайм-аута в минутах - '{}'.FAIL -
Либо аналогичная ошибка, если причина неизвестна:
"FAIL__E05025:Операция VACUUM FREEZE завершилась некорректно, текст ошибки '{}'.FAIL"
После перехода на версию 6.x.x счетчик транзакций начнется с 2^32, что инициирует запуск процесса VACUUM FREEZE, после старта экземпляра СУБД. Данный процесс выполнит заморозку всех блоков данных, не входящих в карту заморозки, параллельно записывая изменения в журнал транзакций (WAL), что потенциально может привести к задержке реплики, проблемам с производительностью и нехватке свободного места на диске.
Для минимизации последствий, необходимо заранее провести полную заморозку всех блоков данных перед началом обновления, предпочтительно в период минимальной активности системы. Для высоконагруженных систем длительность процесса заморозки может превысить отведенное на обновление время, в таком случае, за несколько дней до плановой даты обновления, рекомендуется выполнить несколько итераций заморозки. Команда для запуска заморозки:
vacuumdb -F -a -j <n>
Где n – это количество параллельных потоков (например, 4).
Проверка типа файловой системы для каталогов текущая 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__E03125:Файловая система каталогов {incorrect_filesystem} не соответствует списку разрешенных файловых систем {allowed_fs}.
Для данных каталогов необходимо скорректировать используемые файловые системы.
В случае, если ошибка ложноположительная необходимо скорректировать список поддерживаемых файловых систем с помощью параметра allowed_fs в пользовательском конфигурационном файле и перезапустить сценарий разведки.FAIL
Где:
local_backup_path– путь до директории с локальной резервной копией;pgdata_old_filesystem– тип файловой системы в каталоге текущейPGDATA;pgbackup_filesystem– тип файловой системы в каталогеPGBACKUP;local_backup_filesystem– тип файловой системы в каталоге локальной резервной копии;incorrect_filesystem- список каталогов, используемых неразрешенные файловые системы;allowed_fs- список разрешенный файловых систем.
Необходимо убедиться в корректности типов файловых систем для следующих каталогов. Список каталогов:
- текущая
PGDATA(пример:/pgdata/07/data); - корневая для каталога
PGDATAдиректория (пример:/pgdata); PGBACKUP(пример:/pgarclogs/07);local_backup_path(пример:/pgarclogs).
Для каталогов текущей PGDATA и корневой для нее директории типы файловых систем должны совпадать.
Для каталогов PGDATA, PGBACKUP и local_backup_path типы файловых систем могут отличаться. Рекомендуется чтобы типы файловых систем для данных каталогов были равны ext4. В случае, если типы файловых систем для данных каталогов отличаются от рекомендованных, ответственность за использование подобных файловых систем лежит на администраторе базы данных.
Для этого выполните следующие команды на всех узлах обновляемого стенда:
df -T /pgdata/07/data
df -T /pgarclogs/07
df -T /pgarclogs
Проверка наличия пользовательского списка разрешенных файловых систем
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка наличия пользовательского списка разрешенных файловых систем, отличного от значения по умолчанию.
Если будет обнаружено наличие пользователь пользовательского списка разрешенных файловых систем, отличного от значения по умолчанию (ext4), пользователю будет выведено следующее warning-сообщения:
WARNING__W03018:В процессе работы сценария разведки перед обновлением будет использоваться список разрешенных файловых систем, указанный в пользовательском конфигурационном файле. Пользователь, выполняющий обновление и заполняющий список разрешенных ФС, должен самостоятельно оценить влияние использования файловых систем, отличных от значений по умолчанию. Любые последствия использования ФС, отличных от значений по умолчанию, вплоть до нарушения целостности данных, лежат в ответственности пользователя.
Список разрешенных файловых систем:
{}WARNING
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка наличия ссылок/директорий, необходимых для обновления
- Автоматизированная проверка
- Ручная проверка
Осуществляются проверки наличия ссылок/директорий, используемых в процессе обновления.
-
Если на стенде существует директория, используемая для переноса данных после миграции, будет выведена следующая ошибка:
"FAIL__E03039:Уже существует директория {new_pgdata_tmp} для переноса данных после миграции.
Удалите директорию для дальнейшего обновления.FAIL"Где
new_pgdata_tmp– полный путь до директории в которую планируется перенос данных после миграции. -
Если на стенде существует директория, используемая для создания резервной копии, будет выведена следующая ошибка:
"FAIL__E03040:Уже существует директория {local_backup_path}, в которой будут созданы резервные копии обновляемой базы данных.
Удалите или переименуйте директорию для дальнейшего обновления.FAIL"Где
local_backup_path– директория до нового каталога, необходимого для создания локальной резервной копии. -
Если на стенде существуют директории, используемые для работы СУБД после обновления, будут выведены следующие ошибки:
-
Если существует директория для новой
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 – список таблиц.
Необходимо убедиться в том, что в СУБД отсутствуют более неподдерживаемые reg-типы данных.
Для этого подключитесь к БД и выполните следующий SQL-запрос:
-- scout types/02 . RegTypes
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-типов рассмотреть тип integer, для типа aclitem - тип text.
Проверка массива типов из 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 – список таблиц.
Необходимо убедиться в том, что в СУБД отсутствуют более неподдерживаемые массивы типов из information_schema, содержащие запрещенные типы данных.
Для этого подключитесь к БД и выполните следующий SQL-запрос:
-- 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';
Если в данный запрос вернет не пустой результат, то необходимо заменить запрещенные типы данных на разрешенные: для abstime можно рассмотреть timestamp или timestamptz, для reltime – daterange или tstzrange, tinterval может быть заменен на interval.
Проверка отсутствия неподдерживаемых функций
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка наличия функций неподдерживаемых в новой версии Pangolin.
Если в процессе проверки обнаружены подобные функции, будет выведена следующая ошибка:
"FAIL__E03080:Зафиксированы функции, которые не поддерживаются в новой версии Pangolin.
Список функций: {list_of_functions}FAIL"
Где list_of_functions – список неподдерживаемых функций.
Необходимо убедиться в отсутствии устаревших функций.
Для этого подключитесь к каждой БД и выполните следующий SQL-запрос:
SQL-запрос
WITH pc(pid,proname,proowner,proacl,proargtype,proargmode) AS (
SELECT
oid
,format('%1$I.%2$I',pronamespace::regnamespace::name,proname)
,proowner::regrole::name
,proacl::text proacl
,array_to_string(array_agg(patype::regtype::name ORDER BY ord),',')
,array_to_string(array_agg(pamode ORDER BY ord),',')
FROM pg_proc,unnest(COALESCE(proallargtypes,proargtypes::oid[]),proargmodes,proargnames) WITH ORDINALITY t(patype,pamode,ord)
WHERE COALESCE(pamode,'X')=ANY('{i,b,X}')
GROUP BY 1,2,3,4 ORDER BY oid
),
depr(proname,proowner,proacl,proargtype) AS (
VALUES
('pg_catalog.interval_accum','postgres',NULL,'interval[],interval'), -- 652
('pg_catalog.interval_accum_inv','postgres',NULL,'interval[],interval'), -- 652
('pg_catalog.interval_avg','postgres',NULL,'interval[]'), -- 652
('pg_catalog.interval_combine','postgres',NULL,'interval[],interval[]'), -- 652
('pg_catalog.pg_create_logical_replication_slot','postgres',NULL,'name,name,boolean,boolean'), -- 652
('pg_catalog.pg_current_logfile','postgres','{postgres=X/postgres}','text'), -- 652
('pg_catalog.pg_get_publication_tables','postgres',NULL,'text'), -- 652
('pg_catalog.pg_logical_emit_message','postgres',NULL,'boolean,text,bytea'), -- 652
('pg_catalog.pg_logical_emit_message','postgres',NULL,'boolean,text,text'), -- 652
('pg_catalog.pg_read_file_old','postgres',NULL,'text,bigint,bigint'), -- 652
('pg_catalog.set_wal_key','postgres',NULL,'text') -- 652
)
SELECT pc.* FROM pc JOIN depr using(proname,proargtype)
WHERE
(pc.proowner != 'postgres'::regrole::name)
OR NOT (pc.proacl::text[] = depr.proacl::TEXT[])
В случае обнаружения подобных функций необходимо их удалить.
Проверка наличия процедур, использующих устаревшую версию Python
- Автоматизированная проверка
- Ручная проверка
Выполняется запрос к БД:
WITH pc(lanname,lanacl,lanowner) AS (
SELECT lanname,lanacl,lanowner FROM pg_language pl),
depr(lanname) AS (
VALUES
('internal'),
('c'),
('sql'),
('plpgsql')
)
SELECT pc.* FROM pc JOIN depr using(lanname) WHERE (pc.lanowner != 'postgres'::regrole OR coalesce(cardinality(pc.lanacl),0) >0 OR cardinality(pc.lanacl) =0);
SELECT
format('%1$I.%2$I %3$s',pronamespace::regnamespace::TEXT,proname,lanname)
FROM pg_catalog.pg_proc pp JOIN pg_catalog.pg_language pl ON pp.prolang =pl.oid
AND pl.lanname IN('plpythonu','plpython2u');
Если результат запроса не пустой, то будет выведена следующая ошибка:
"FAIL__E03013:Прекращена поддержка языка Python 2.х.
Список процедур, использующих их (<имя схемы>.<имя процедуры>): {list_of_procedures}.
Удалите расширения на Python 2.х. и перепишите процедуры, использующие эту версию языка.FAIL"
Где list_of_procedures – список неподдерживаемых процедур.
Необходимо убедиться в отсутствии использования устаревших языков программирования для написания функций и хранимых процедур.
Для этого подключитесь к каждой БД и выполните следующий SQL-запрос:
WITH pc(lanname,lanacl,lanowner) AS (
SELECT lanname,lanacl,lanowner FROM pg_language pl),
depr(lanname) AS (
VALUES
('internal'),
('c'),
('sql'),
('plpgsql')
)
SELECT pc.* FROM pc JOIN depr using(lanname) WHERE (pc.lanowner != 'postgres'::regrole OR coalesce(cardinality(pc.lanacl),0) >0 OR cardinality(pc.lanacl) =0);
SELECT
format('%1$I.%2$I %3$s',pronamespace::regnamespace::TEXT,proname,lanname)
FROM pg_catalog.pg_proc pp JOIN pg_catalog.pg_language pl ON pp.prolang =pl.oid
AND pl.lanname IN('plpythonu','plpython2u');
В случае обнаружения устаревших функций процедур, перед обновлением необходимо удалить расширения использующие Python 2.х. и переписать процедуры, использующие эту версию языка.
Проверка наличия схем с oid 2200
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка наличия схем с oid = 2200.
Если обнаружены схемы с oid = 2200, отличные от схемы public, будет выведена следующая ошибка:
"FAIL__E03088:В кандидате на обновление обнаружены схемы с oid 2200 отличные от public в следующих базах данных: {list_of_databases}.
Для продолжения обновления необходимо произвести переименование схем в public.FAIL"
Где list_of_databases – список баз данных.
Необходимо убедиться в отсутствии схем с oid =2200, отличных от схемы public.
Для этого необходимо подключиться к каждой БД и выполнить следующий SQL-запрос:
SELECT case WHEN nspname = 'public' THEN true ELSE false END FROM pg_namespace WHERE oid = 2200;
Если подобные схемы будут обнаружены, необходимо произвести их переименование в public.
Проверка с помощью утилиты 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-запрос:
SELECT slot_name FROM pg_replication_slots WHERE slot_type = 'logical';
Если подобные слоты репликации будут обнаружены, перед обновлением необходимо их удалить.
Проверка наличия нестандартных прав или нестандартных владельцев для объектов
- Автоматизированная проверка
- Ручная проверка
Выполняется 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 – список объектов в БД с нестандартными правами/владельцем.
Необходимо проверить наличие нестандартных прав или нестандартных владельцев для объектов.
Для этого необходимо подключиться к БД и выполнить следующий 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_)';
Если данный запрос выведет непустое значение, то необходимо выполнить восстановление прав или владельцев для полученных объектов, так как в новой версии СУБД они отсутствуют.
Проверка близости к порогу принудительной заморозки транзакций
- Автоматизированная проверка
- Ручная проверка
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"
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
;
Если запрос выведет не пустое значение, база данных близка к порогу принудительной заморозки транзакций.
Перед обновлением необходимо предварительно либо выполнить vacuumdb -a -F -v (заморозка транзакций в кластере баз), либо увеличить значение параметра autovacuum_freeze_max_age глобально, исходя из формулы max_frozen_age > 0.8 * autovacuum_freeze_max_age.
Проверка наличия зависимостей представлений от таблиц/представлений, относящихся к расширениям
- Автоматизированная проверка
- Ручная проверка
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_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;
Если запрос выведет не пустое значение, необходимо устранить данную зависимость.
Проверка наличия зависимостей представлений от функций, относящихся к расширениям
- Автоматизированная проверка
- Ручная проверка
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"
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;
Если запрос выведет не пустое значение, необходимо устранить данную зависимость.
Проверка наличия таблиц, связанных внешним ключом с таблицами, относящихся к расширению
- Автоматизированная проверка
- Ручная проверка
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"
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;
Если запрос выведет не пустое значение, необходимо устранить данную зависимость.
Проверка наличия повреждений системного каталога 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"
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));
Если запрос выведет не пустое значение, необходимо будет подключиться к БД и удалить сбойные ограничения и добавить корректные, используя команды DROP и ADD. При добавлении корректного ограничения (команда ALTER TABLE .. ADD CONSTRAINT) могут быть обнаружены данные, нарушающие ограничение. Такие данные могли быть добавлены при сбойном ограничении. В этом случае исправить данные или ограничение можно только вручную.
Проверка наличия потерянных записей 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"
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);
Если запрос выведет не пустое значение, необходимо будет удалить данные значение из БД
Проверка наличия индексов 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"
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);
Если данный запрос выведет непустое значение, необходимо будет удалить данный ключ или пересоздать его по пути <имя БД>.<имя схемы>.<имя таблицы>.
Проверка отсутствия ссылок, ссылающихся на другие ссылки при создании табличных пространств в БД, а также ссылок, созданных с использованием относительных путей
- Автоматизированная проверка
- Ручная проверка
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"
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';
Если данный запрос выведет непустое значение, необходимо будет удалить данный ключ или пересоздать его по пути <имя БД>.<имя схемы>.<имя таблицы>.
Проверка наличия 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"
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';
Если данный запрос выведет непустое значение, необходимо будет запустить скрипт reindex_gin.sql после обновления.
Проверка методов аутентификации в СУБД
- Автоматизированная проверка
- Ручная проверка
Скрипт-разведчик выполняет поиск в файле 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- наименование узла стенда.
Необходимо убедиться, что в конфигурационном файле postgresql.conf отсутствуют неподдерживаемые параметры.
Для этого произведите проверку конфигурационного файла postgresql.conf на наличие следующих параметров:
vacuum_cleanup_index_scale_factor;operator_precedence_warning;stats_temp_directory.
Если данные параметры будут обнаружены, перед началом обновления, необходимо их удалить.
Проверка значения 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.
Необходимо убедиться в корректности выставленного значения параметра max_worker_processes в конфигурационном файле.
Значение данного параметра должно превышать сумму количества баз данных на узле (включая системные template1, postgres) + 6. Например, если количество БД = 26, то значение параметра должно быть не меньше 32. Минимальным значением параметра max_worker_processes является 8.
Проверка отсутствия ссылок при создании табличных пространств в БД
- Автоматизированная проверка
- Ручная проверка
Производится проверка использования ссылок для указания местоположения табличных пространств в БД.
Если подобные ссылки будут обнаружены, будет выведена следующая ошибка:
"FAIL__E03105:Обнаружено использование ссылки для указания местоположения табличного пространства в БД.
Для работы скриптов обновления в базе данных необходимо указать реальные пути для всех табличных пространств.
Допустимые символические ссылки для pg_tablespace_location должны начинаться на: '/pgdata/data' либо '/pgdata/<XX>' (две цифры).
Список найденных некорректных путей: {}FAIL"
Где list_of_paths - список некорректных путей до табличных пространств.
Необходимо убедиться, что в указании путей до табличных пространств отсутствуют символические ссылки. Для этого необходимо выполнить следующую команду:
realpath <path_to_tablespace>
Где path_to_tablespace - путь до табличного пространства, указанный в СУБД. Необходимо проверить путь до каждого табличного пространства, используемого в СУБД
Если в ходе проверки обнаружится использование ссылок, то перед проведением обновления необходимо указать реальные пути до табличных пространств, либо скорректировать такие ссылки.
Проверка отсутствия ссылок, ссылающихся на другие ссылки при создании табличных пространств в БД, а также ссылок, созданных с использованием относительных путей
- Автоматизированная проверка
- Ручная проверка
Проводится проверка использования для указания местоположения табличных пространств в БД символических ссылок, ссылающихся на другие символические ссылки, а также ссылок, созданных с использованием относительных путей.
"FAIL__E03115:Обнаружены табличные пространства, location которых содержат неподдерживаемые символические ссылки (символические ссылки, созданные с использованием относительных путей, символические ссылки, ссылающиеся на другие ссылки).
Список найденных ссылок: '{}'.FAIL"
Где list_of_paths – список некорректных путей до табличных пространств.
readlink -v <path_to_tablespace>
Где path_to_tablespace – путь до табличного пространства, указанный в СУБД. Необходимо проверить путь до каждого табличного пространства, используемого в СУБД.
Если в ходе проверки обнаружится использование недопустимых ссылок, то перед проведением обновления необходимо скорректировать такие ссылки.
Проверка отсутствия вложенных табличных пространств в БД
- Автоматизированная проверка
- Ручная проверка
Производится проверка вложенных табличных пространств в БД. Каталоги табличных пространств не должны быть размещены в каталогах других табличных пространств.
Если вложенные табличные пространства обнаружены, будет выведена следующая ошибка:
"FAIL__E03116:Обнаружены вложенные табличные пространства, location которых являются родительской директорией для каталогов других табличных пространств.
Скорректируйте табличные пространства таким образом, чтобы для каждого location был указан собственный каталог, не являющийся частью пути к каталогу другого табличного пространства.
Список путей родительских табличных пространств в которых обнаружена проблема: '{}'.
Список путей дочерних табличных пространств: '{}'.FAIL"
Необходимо убедиться, что каталоги табличных пространств не размещены в каталогах других табличных пространств. Для этого необходимо выполнить запрос в БД:
SELECT oid, spcname, pg_tablespace_location(oid) FROM pg_tablespace WHERE spcname not in ('pg_default', 'pg_global');
Затем получить реальные пути для каждого значения указанного в поле pg_tablespace_location из таблицы полученной при выполнении запроса в БД:
realpath <path_to_tablespace>
Где path_to_tablespace – путь до табличного пространства, указанный в СУБД. Необходимо проверить путь до каждого табличного пространства, используемого в СУБД.
Если в ходе проверки обнаружится, что одно из значений реального пути до табличного пространства полностью совпадает с частью пути до другого табличного пространства, то перед проведением обновления необходимо переместить такие пространства в собственные каталоги.
Проверка наличия неподдерживаемых значений параметра clientcert в правилах pg_hba.conf
- Автоматизированная проверка
- Ручная проверка
Скрипт-разведчик выполняет поиск в файле pg_hba.conf неподдерживаемых значений для параметра clientcert.
Если подобные значения будут обнаружены, выводится ошибка:
"FAIL__E03071:В кандидате на обновление обнаружены неподдерживаемые параметры {parameter_names} в правилах pg_hba на хосте {inventory_hostname}.
Для корректного обновления необходимо произвести удаление этих параметров.FAIL"
Где:
parameter_names– список неподдерживаемых параметров;inventory_hostname– наименование узла стенда.
Необходимо убедиться, что отсутствуют неподдерживаемые параметры clientcert в конфигурационном файле pg_hba.conf. Для этого выполните команду:
grep -i 'clientcert.*[0-1]|clientcert.*no-verify' <path_to_pg_hba_config>
Где path_to_pg_hba_config – полный путь до конфигурационного файла pg_hba.conf.
Если данная команда выведет неподдерживаемые параметры, их необходимо удалить.
Проверка игнорирования ошибок при обновлении расширений
- Автоматизированная проверка
- Ручная проверка
При заполнении в конфигурационном файле custom_config_initial.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
Утилита pg_upgrade проверяет, есть ли в обновляемой СУБД пользовательские таблицы со столбцами типа xid. Если есть, выводит сообщение с требованием их удалить перед обновлением. Список таких объектов БД перечислен в файле tables_using_xid.txt. Список таких объектов БД перечислен в файле tables_using_xid.txt:
Checking for incompatible "xid" data type fatal
Your installation contains the "xid" data type in user tables.
The internal format of "xid" changed in Pangolin 6.1.0 so this cluster
cannot currently be upgraded. Note that even dropped attributes cause a problem.
You can remove the problem tables and restart the upgrade.
A list of the problem columns is in the file:
tables_using_xid.txt
Проверки для обновления исполняемых файлов
При данном типе обновления выполняются все проверки из блока «Проверки для всех типов обновлению», а также проверки перечисленные далее в данном блоке.
Проверка с помощью утилиты 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.
Необходимо убедиться, что сценарий обновления исполняемых файлов подходит для стенда. Запустите команду из примера ниже на мастере и на реплике:
sudo mkdir -p /home/postgres/pg_inplace_upgrade/{backup,log,dump}
sudo chmod 700 -R /home/postgres/pg_inplace_upgrade
sudo chown postgres:postgres -R /home/postgres/pg_inplace_upgrade
sudo dnf install ~/pangolin/utilities/pangolin-inplace-upgrade-$PANGOLIN_VER-sberlinux8.x86_64.rpm
sudo -iu postgres
export PANGOLIN_VER=x.x.x
export PANGOLIN_OLD_VER=x.x.x
export PGPASSWORD=<password for db user>
cd /opt/pangolin-utilities/bin/pg_inplace_upgrade
./inplace_upgrade.sh info -n $PANGOLIN_OLD_VER -N $PANGOLIN_VER -s /opt/pangolin-utilities/bin/pg_inplace_upgrade -B /home/postgres/pg_inplace_upgrade/backup -d /pgdata/06/data -l /home/postgres/pg_inplace_upgrade/log -p 5433 -h 127.0.0.1 -u postgres -b postgres -m /home/postgres/pg_inplace_upgrade/dump -t /usr/pangolin/bin -T /usr/pangolin-dbms-client/bin -P $PGPASSWORD
В случае, если необходимо произвести обновление системных данных каталога, будет выведено сообщение:
INFO: Location of update_catalog_version utility: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version
INFO: The log-file containing postgresql logs produced during catalog update: /pgarclogs/pg_inplace_upgrade/log/postgres_updade.log
INFO: The summarized catalog update report: /pgarclogs/pg_inplace_upgrade/log/report.log
INFO: ======= START INPLACE_UPGRADE IN INFO MODE =======
INFO: ----------- Initial update analysis -----------
INFO: CATALOG_VERSION_NO_OLD: 202310091
INFO: Following directories will be searched to find sql-scripts applicable in this run:
INFO: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version/sql_upgrade_6xx/<PANGOLIN_OLD_VER>/
INFO: Version: 6.4.0 CATALOG_VERSION_NO_NEW: 202409231
INFO: Initial update analysis........................... OK
INFO: ----------- Update CATALOG_VERSION_NO -----------
INFO: update_catalog_version: The new catalog version is the same as the current one.
INFO: Update CATALOG_VERSION_NO......................... OK
INFO: ----------- Read all catalog update SQL-scripts -----------
INFO: Read all catalog update SQL-scripts............... OK
INFO: ----------- Extract info about users tablespaces -----------
INFO: paths: /opt/pangolin_cache/pg_inplace_upgrade/tmp_check/test_db
INFO: version: PostgreSQL 15.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Platform V SberLinux 8.5.0-18), 64-bit
INFO: Extract info about users tablespaces.............. OK
INFO:
INFO mode finished with Success. Update required.
===================================================
Если нет необходимости в обновлении системных данных каталога, будет выведено сообщение:
INFO: Location of update_catalog_version utility: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version
INFO: The log-file containing postgresql logs produced during catalog update: /pgarclogs/pg_inplace_upgrade/log/postgres_updade.log
INFO: The summarized catalog update report: /pgarclogs/pg_inplace_upgrade/log/report.log
INFO: ======= START INPLACE_UPGRADE IN INFO MODE =======
INFO: ----------- Initial update analysis -----------
INFO: CATALOG_VERSION_NO_OLD: 202409231
INFO: Following directories will be searched to find sql-scripts applicable in this run:
INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.4.0/
INFO: Version: 6.4.0 CATALOG_VERSION_NO_NEW: 202409231
INFO: Initial update analysis........................... OK
INFO:
INFO mode finished with Success. Update not required.
===================================================
Если в процессе работы утилиты что-то пошло не так, будет выведено сообщение:
INFO: Location of update_catalog_version utility: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version
INFO: The log-file containing postgresql logs produced during catalog update: /pgarclogs/pg_inplace_upgrade/log/postgres_updade.log
INFO: The summarized catalog update report: /pgarclogs/pg_inplace_upgrade/log/report.log
INFO: ======= START INPLACE_UPGRADE IN INFO MODE =======
INFO: ----------- Initial update analysis -----------
INFO: CATALOG_VERSION_NO_OLD: 202310091
INFO: Following directories will be searched to find sql-scripts applicable in this run:
INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.2.0/
INFO: Version: 6.2.0 CATALOG_VERSION_NO_NEW: 202310091
INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.3.0/
INFO: Version: 6.3.0 CATALOG_VERSION_NO_NEW: 202310091
INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.4.0/
INFO: Version: 6.4.0 CATALOG_VERSION_NO_NEW: 202409231
ERROR: File /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.4.1/CATALOG_VERSION was not found
INFO: Initial update analysis........................... FAIL
INFO:
INFO mode finished with Error.
===================================================
Проверка наличия физических слотов репликации
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия физических слотов репликации.
Если будет обнаружен физический слот репликации, который зарезервирован для использования утилитой pangolin-inplace-upgrade, будет выведена следующая ошибка:
"FAIL__E03102:На стенде {inventory_hostname} обнаружено использование физической репликации {name_tmp_slot}, которая нужна для корректного выполнения обновления.
Для продолжения обновления требуется удалить данный слот.FAIL"
Где:
inventory_hostname– наименование узла стенда;name_tmp_slot– наименование физического слота репликации.
Необходимо убедиться, что зарезервированный для обновления физический слот репликации отсутствует в СУБД.
Для этого подключитесь к БД и выполните следующий SQL-запрос:
SELECT count(*) FROM pg_replication_slots WHERE slot_name = tmp_update_slot;
Если данный физический слот репликации существует, то необходимо удалить данный слот.
Вывод информационных сообщений процесса разведки
Раздел описывает возможные информационные сообщения скрипта-разведчика в случае автоматизированной проверки. При реализации ручного варианта проверки — пропустите данный раздел.
Вывод информационного сообщения для типа обновления с переносом данных
Если обновление будет производиться с переносом данных, то выводится информационное сообщение:
"INFO__I03001:Для миграции данных используется специальная утилита pg_upgrade.
Во время миграции данные в новую версию базы данных будут перенесены в режиме копирования данных, что приведет к дополнительному увеличению времени обновления СУБД.INFO"
Вывод информационного сообщения о недоступности СУБД
Перед завершением работы скрипта-разведчика будет выведено следующее информационное сообщение:
"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.1
- inplace_upgrade с версии pangolin 6.1.11 до версии pangolin 6.6.1
- исполняемых файлов с версии 6.4.3 до версии 6.6.1
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"
Вывод информационного сообщения об успешном завершении сценария проверки
При успешном прохождении выше описанных проверок будет выведено следующее сообщение:
"OK__S03001:Разведка перед обновлением успешно выполнена.OK"
Если проверка прошла успешно, то необходимо переходить к процессу обновления.