Проверка готовности к обновлению
Данный раздел описывает процесс проверки готовности экземпляра СУБД Pangolin к обновлению.
Выполнение проверки готовности к обновлению доступно ручным и автоматизированным способом:
- Автоматизированная проверка перед обновлением обусловлена обязательным запуском скрипта-разведчика (
playbook_scouting.yaml
), в задачи которого входит выполнение ряда проверок, сбора информации о стенде, а также вычислении типа обновления версии СУБД, необходимого для перехода на новую версию СУБД 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
. -
Запустите проверку, для этого используйте Ansible сценарий (
playbook_scouting.yaml
). Пример команды: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=${}"
Далее приведены шаблоны сценариев для различных решений:
- для конфигурации 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=${}" \ansible-playbook playbook_scouting.yaml \
-i inventories/standalone/hosts.ini \
-t always,standalone \
--ask-vault-pass \
-vv \
--extra-vars "local_distr_path=${} \
custom_config=${}" \Описание параметров:
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 меньше поддерживаемой версии, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E01002:Версия установленного ansible: {installed_ansible_version}. Для работы требуется версия не ниже {min_ansible_version} и не выше {max_ansible_version}.__{{ control_name }}.FAIL"
Где:
installed_ansible_version
- установленная версия Ansible на стенде;min_ansible_version
- минимально необходимая версия Ansible;max_ansible_version
- максимально допустимая версия Ansible.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка возможности скачивания зависимостей, необходимых для корректной работы скриптов автоматизации
- Автоматизированная проверка
- Ручная проверка
Производится проверка возможности скачивания пакетов, необходимых для корректной работы скриптов автоматизации.
Если возникнут проблемы при скачивании пакетов, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03028:Обнаружена ошибка во время проверки скачивания {package_manager} пакетов {list_of_packages}. Проверьте настройку репозиториев.__{{ control_name }}.FAIL"
Где:
package_manager
- название менеджера пакетов;list_of_packages
- список пакетов, которые не удалось скачать.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка поддерживаемых ОС и их версий
- Автоматизированная проверка
- Ручная проверка
Производится проверка типа и версии ОС стенда.
Если СУБД установлена на ОС и/или версии ОС, которая более не поддерживается, будет выведены следующие ошибки:
"{{ control_name }}.FAIL__E01006:Текущая ОС {current_os} не поддерживается. Список поддерживаемых ОС: {list_of_os}.__{{ control_name }}.FAIL"
"{{ control_name }}.FAIL__E01007:Используемый дистрибутив {current_distribution} версия: {current_distribution_version}. Поддерживаемый дистрибутив {current_distribution}: с версии {min_required_os} до {max_required_os}.__{{ control_name }}.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 8.8 (Dykhtau)
CPE OS Name: cpe:/o:sberlinux:sberlinux:8::baseos
Kernel: Linux 4.18.0-477.27.1.sl8_8.1.x86_64
Architecture: x86-64
Из вывода выполненной команды сравните значение из параметра Operating System
с поддерживаемыми ОС из раздела «Системные требования».
Проверки сетевых имен для узлов стенда
- Автоматизированная проверка
- Ручная проверка
Данные проверки осуществляются, если стенд был настроен с помощью FQDN узлов и был включен параметр used_fqdn_host
. По умолчанию данный параметр включен.
-
Осуществляется проверка, что среди узлов стенда, указанных в
inventory
, отсутствует узел с которого был запущен скрипт автоматизации. Если подобный узел был найден, будет выведена следующая ошибка:"{{ control_name }}.FAIL__E01005:{inventory_hostname} имеет проблемы с получением сетевого имени от DNS сервера. Проверьте корректность файлов /etc/hosts и /etc/resolv.conf.__{{ control_name }}.FAIL"
Где
inventory_hostname
- имя узла стенда, с которого был запущен скрипт автоматизации. -
Производится проверка доступности узлов по сетевому имени. Проверка осуществляет опрос DNS сервера на предмет получения IP-адресов для сетевых имен узлов стенда. Если данная проверка не пройдена, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01043:В кандидате на обновление для хоста {} был определен следующий fqdn {}. Данный fqdn не прошел проверку доступности. Такое может быть, когда некорректно настроен DNS-сервер или указано некорректное DNS имя для хоста в /etc/hosts.__{{ control_name }}.FAIL"
-
Производится проверка соответствия IP-адреса, полученного от DNS сервера и IP-адреса, указанного на узле. В случае неудачи данной проверки будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01046:В кандидате на обновление для хоста {} определен следующий FQDN {}. Он не соответствует IP-адресу, полученному с хоста. Это может быть связано с некорректной настройкой DNS-сервера или неправильным указанием DNS-имени для хоста в /etc/hosts.__{{ control_name }}.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
.
Если файл лицензии не найден, будет выведена ошибка:
"{{ control_name }}.FAIL__E01021:Лицензия, переданная в параметре pangolin_license_path, не найдена. Для продолжения скорректируйте параметр pangolin_license_path, указав путь до лицензии.__{{ control_name }}.FAIL"
Если проверка валидности файла лицензии проходит неудачно, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01022:Переданная лицензия невалидная.
{error_stdout}__{{ control_name }}.FAIL"
Где error_stdout
- вывод результата проверки файла лицензии.
Необходимо выполнить проверку файла лицензии на валидность. Для этого выполните следующую команду:
/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 на узлах стенда.
Если проверки не будут пройдены, будут выведены следующие ошибки:
"{{ control_name }}.FAIL__E01015:На хосте {inventory_hostname}, не найден файл {path_to_file} или он пустой. Для продолжения нужно инициализировать данный файл.__{{ control_name }}.FAIL"
"{{ control_name }}.FAIL__E01016:На хосте {inventory_hostname}, содержимое файла /etc/machine_id не имеет hex формат. Для продолжения нужно переинициализировать данный файл.__{{ control_name }}.FAIL"
Где:
inventory_hostname
- имя узла стенда;path_to_file
- путь до файла с Machine ID.
Для проверки наличия Machine ID необходимо выполнить команду:
hostnamectl
В выводе данной команды необходимо убедиться, что поле Machine ID
заполнено
Проверка корректности конфигурационного файла postgresql.conf
- Автоматизированная проверка
- Ручная проверка
Производится проверка конфигурационного файла postgresql.conf
на предмет ошибок заполнения.
Если конфигурационный файл содержит какие-либо ошибки, то выводится сообщение:
"{{ control_name }}.FAIL__E03031:В кандидате на обновление для хоста {inventory_hostname}, в конфигурационном файле postgresql.conf обнаружены ошибки заполнения.__{{ control_name }}.FAIL"
Где inventory_hostname
- имя узла стенда.
Для проверки корректности заполнения конфигурационного файла postgresql.conf
, подключитесь БД и выполните следующий SQL-запрос:
SELECT sourcefile, name, sourceline, error FROM pg_file_settings WHERE error IS NOT null;
Если данный запрос ничего не выведет, то ошибок в конфигурационном файле postgresql.conf
, в противном случае необходимо будет устранить все полученные ошибки.
Проверка поддерживаемой версии к обновлению
- Автоматизированная проверка
- Ручная проверка
Производится проверка возможности обновления СУБД с текущей версии, установленной на стенд.
В случае невозможности обновления будет получена ошибка вида:
"{{ control_name }}.FAIL__E03017:Обновление невозможно, так как текущая версия ({current_db_version}) не поддерживается. Минимальная поддерживаемая версия: {min_db_version}. Рекомендуется обновиться на промежуточную версию.__{{ control_name }}.FAIL"
Где:
current_db_version
- версия Pangolin, установленная на стенде;min_db_version
- минимально поддерживаемая версия Pangolin для обновления.
Для осуществления обновления вручную необходимо обратиться к администратору.
Необходимо убедиться, что версию, установленную на стенде, возможно обновить до данной версии. Для этого проверьте что установленная версия дистрибутива, содержится в разделе «Таблица поддерживаемых для обновления версий СУБД».
Проверка использования KMS-заменителя
- Автоматизированная проверка
- Ручная проверка
Обновление стендов с включенным КМС-заменителем произвести будет невозможно. В скриптах разведчика организована проверка на случай таких стендов.
Если обнаружено наличие КМС-заменителя, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03058:Обновление невозможно, так как на стенде обнаружено использование VAULT-заменителя. Переведите стенд на использование физического VAULT-сервера и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"
Необходимо проверить на что указывает ссылка, располагаемая по пути /usr/pangolin/lib/libconnector_plugin.so
.
Для этого выполните команду:
readlink -f /usr/pangolin-dbms-client-6.5/lib/libconnector_plugin.so
Полученный, в ходе выполнения команды путь, не должен быть равен следующему пути /usr/pangolin/lib/plugins/libkms_substitute_plugin.so
.
Проверка пароля postgres_db_pass, передаваемого в пользовательском конфигурационном файле
- Автоматизированная проверка
- Ручная проверка
Производится проверка пароля для доступа к базе, указываемого в параметре postgres_db_pass
пользовательского конфигурационного файла. Ожидается, что данный пароль засекречен с помощью ansible-vault значение.
В случае ошибки будет получено следующее сообщение:
"{{ control_name }}.FAIL__E01017:Переданный пароль от суперпользователя postgres не соответствует ни открытому виду, ни ansible-хешу. Требуется передать пароль в открытом виде или в виде ansible-хеша. Для продолжения работы необходим пароль.__{{ control_name }}.FAIL"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка корректной записи хеша пароля суперпользователя postgres во временный файл для корректной инициализации БД
- Автоматизированная проверка
- Ручная проверка
Производится проверка записи хеша пароля суперпользователя postgres во временный файл.
Если записать хеш во временный файл не получается, будет получено сообщение вида:
"{{ control_name }}.FAIL__E01018:В процессе формирования хеша для пароля суперпользователя postgres что-то пошло не так. Пароль не был записан во временный файл '{path_to_tmp_file}'. Инициализация БД невозможна. Ознакомьтесь с логами.__{{ control_name }}.FAIL"
Где path_to_tmp_file
- путь до временного файла с паролем.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка корректного расположения утилиты secret_storage_client
- Автоматизированная проверка
- Ручная проверка
Для осуществления проверки готовности защищенного хранилища VAULT
к последующему обновлению, скрипты используют утилиту secret_storage_client
, которая входит в состав дистрибутива.
Утилита расположена в папке installer/utilities/secret_storage_client_bundle/bin/
. При отсутствии утилиты будет выведено предупреждающее сообщение (процесс работы скриптов при этом не останавливается).
В случае если утилита не обнаружена, будет получено предупреждение:
"{{ control_name }}.WARNING__W03002:Не обнаружена утилита secret_storage_client. Проверки готовности защищенного хранилища VAULT к обновлению будут пропущены.__{{ control_name }}.WARNING"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка наличия конфигурационного файла VAULT
- Автоматизированная проверка
- Ручная проверка
Выполняется поиск конфигурационного файла для подключения к VAULT. При отсутствии файла будет выведено сообщение:
"{{ control_name }}.FAIL__E03066:В кандидате на обновление не обнаружен конфигурационный файл '{path_to_config}' для подключения к VAULT. Проверьте состояния стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.__{{ control_name }}.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 будет выведено сообщение вида:
"{{ control_name }}.FAIL__E03067:Не удалось обнаружить ни одного успешного подключения к защищенному(ым) хранилищу(ам) VAULT. В результате возникли ошибки: {error_stdout}. Проверьте состояние стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.__{{ control_name }}.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
- Автоматизированная проверка
- Ручная проверка
Выполняется попытка получения параметров из защищенного хранилища. В случае возникновения ошибок будет получено сообщение вида:
"{{ control_name }}.FAIL__E03060:В процессе получения списка параметров из защищенного хранилища VAULT возникли ошибки: '{error_stdout}'. Причиной может быть отсутствие конфигурационного файла '{path_to_config}' с параметрами подключения к защищенному хранилищу VAULT. Произведите проверку состояние подключения к VAULT серверу(ам) и повторите запуск скрипта разведчика.__{{ control_name }}.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
, в противном случае будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03061:Значение параметра secure_config в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При включенной защите параметров конфигурации значение для параметра secure_config должно быть 'on' в защищенном хранилище VAULT. Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT. Затем повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"
В случае отключенной защиты конфигурации, в защищенном хранилище значение параметра secure_config
должно быть равно off
. Если обнаружено несоответствие, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03062:Значение параметра secure_config в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При выключенной защите параметров конфигурации значение для параметра secure_config должно быть 'off' в защищенном хранилище VAULT. Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT. Затем повторите запуск скрипта разведчика.__{{ control_name }}.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
, в противном случае будет выведена ошибка:
"{{ control_name }}.FAIL__E03063:Значение параметра is_tde_on в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При включенном прозрачном защитном преобразовании данных значение для параметра is_tde_on должно быть 'on' в защищенном хранилище VAULT. Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT. Затем повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"
В случае, если TDE выключено, значение параметра is_tde_on
в защищенном хранилище будет соответствовать off/false
. В случае обнаружения несоответствия, будет выведена следующая ошибка:
{{ control_name }}.FAIL__E03064:Значение параметра is_tde_on в защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При выключенном прозрачном защитном преобразовании данных значение для параметра is_tde_on должно быть 'off' на защищенном хранилище VAULT. Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT. Затем повторите запуск скрипта разведчика.__{{ control_name }}.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
в защищенном хранилище и локальном конфигурационном файле. Значения параметра в обоих случаях должны быть одинаковыми, в противном будет получено сообщение вида:
"{{ control_name }}.FAIL__E03065:Значение параметра pg_ident в защищенном хранилище VAULT должно соответствовать значению в локальном конфигурационном файле '{path_to_dir}/pg_ident.conf'. Проверьте состояние стенда на наличие подключенных средств защиты информации и корректность сконфигурированного id на сервере VAULT. Затем повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"
Где path_to_dir
- путь до директории в конфигурационном файле.
Проверку необходимо выполнять при наличии включенных СЗИ.
-
Выполните следующую команду (под пользователем postgres) для получения значения параметра
pg_ident
из конфигурационного файлаpg_ident.conf
:cat /pgdata/0{base_version}/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.
Проверка подключения к базе данных
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка тестового подключения в БД.
Если подключение к БД завершится неудачей из-за некорректного пароля для пользователя postgres, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01019:Пароль суперпользователя postgres в хранилище SecMan (системе хранения и управления секретами) не соответствует текущему паролю в базе данных.__{{ control_name }}.FAIL"
Если подключение к БД завершится неудачей из-за отсутствия некорректного доступа в pg_hba
, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01048:Файл 'pg_hba.conf' не содержит корректной строки для подключения пользователя '{username}' к хосту '{inventory_hostname}' с использованием метода 'scram-sha-256'.__FAIL"
Где:
username
- имя пользователя, под которым производилось тестовое подключение;inventory_hostname
- имя узла стенда.
Если при подключении к БД возникла непредвиденная ошибка, будет выведено следующее сообщение:
"{{ control_name }}.FAIL__E01049:При выполнении тестового запроса к хосту '{inventory_hostname}' через порт '{db_port}' c текущими данными для подключения пользователя '{username}' в pg_hba.conf произошла непредвиденная ошибка. Оригинальный текст ошибки: \"'{error_stdout}'\"/. Устраните проблему и попробуйте снова.__{{ control_name }}.FAIL"
Где:
username
- имя пользователя, под которым производилось тестовое подключение;inventory_hostname
- имя узла стенда;db_port
- порт, к которому производилось подключение;error_stdout
- оригинальный текст ошибки подключения.
Необходимо убедиться, что подключение к БД выполняется без каких-либо проблем.
Для этого выполните подключение к БД на мастере и на реплике, и выполните следующий SQL-запрос:
SELECT now();
Если в процессе подключения к БД возникли какие-либо проблемы, их необходимо устранить.
Проверка наличия записей postgres в cron
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка отсутствия/наличия записей postgres в cron
.
Если в файле /etc/cron.allow
не удалось найти записи postgres, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01044:В конфигурационном файле /etc/cron.allow не удалось обнаружить запись postgres. Для корректной работы скриптов развертывания/обновления необходимо добавить данную запись либо удалить файл.__{{ control_name }}.FAIL"
Если в файле /etc/cron.deny
обнаружена запись postgres, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01045:В конфигурационном файле /etc/cron.deny была обнаружена запись postgres. Для корректной работы скриптов развертывания/обновления необходимо удалить данную запись.__{{ control_name }}.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 мб
), то будет выведена ошибка:
"{{ control_name }}.FAIL__E03082:В кандидате на обновление обнаружен недопустимый объем lag: {current_lag}. Для продолжения обновления нужно синхронизировать кластер до максимального объема lag {max_lag}.__{{ control_name }}.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 Мб.
Проверка прослушивания портов
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка того, что сервисы, обновляемого стенда, прослушивают необходимые порты на узле.
Если проверка закончится неудачей, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03106:Сервис {service_name} не прослушивает ни один из портов. Проверьте состояние сервиса или настройки конфигурационного файла.__{{ control_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
, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E01003:На хосте host_name в файле /etc/systemd/logind.conf включен параметр KillUserProcesses=yes, для дальнейшей работы требуется переключить данный параметр в положение KillUserProcesses=no и перезапустить хост.__{{ control_name }}.FAIL"
Убедитесь в отсутствии включенного параметра KillUserProcesses
в файле /etc/systemd/logind.conf
.
Для этого на каждом узле стенда выполните следующую команду:
cat /etc/systemd/logind.conf | grep KillUserProcesses
Параметр KillUserProcesses
должен быть закомментирован, либо быть в состоянии no
.
Проверка отсутствия неудачных попыток обновления
- Автоматизированная проверка
- Ручная проверка
Скрипт проверки осуществляет проверку предыдущих обновлений и фиксирует неудачные попытки.
Если предыдущие попытки обновления были неуспешными, либо, если при неудачном обновлении был некорректно произведен автоматический откат, то скрипт прервется и создаст файл /home/postgres/.update_pgse/update_disallowed
. Пользователю будет выведено сообщение:
"{{ control_name }}.FAIL__E03021:Зафиксирована неудачная попытка обновления версии СУБД Pangolin. В ручном режиме восстановите полностью состояние кластера предыдущей/исходной версии СУБД Pangolin и удалите файл {path_to_file}.__{{ control_name }}.FAIL"
Где path_to_file
- полный путь до файла update_disallowed
.
В этом случае необходимо вручную откатить стенд на исходное состояние (см. раздел «Откат»), удалить файл /home/postgres/.update_pgse/update_disallowed
, а затем перезапустить разведку.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка отсутствия неудачных попыток обновления
- Автоматизированная проверка
- Ручная проверка
Скрипт проверки осуществляет проверку предыдущих обновлений и фиксирует неудачные попытки.
Если предыдущие попытки обновления были неуспешными, либо, если при неудачном обновлении был некорректно произведен автоматический откат, то скрипт прервется и создаст файл /home/postgres/.update_pgse/update_disallowed
. Пользователю будет выведено сообщение:
"{{ control_name }}.FAIL__E03021:Зафиксирована неудачная попытка обновления версии СУБД Pangolin. В ручном режиме восстановите полностью состояние кластера предыдущей/исходной версии СУБД Pangolin и удалите файл {path_to_file}.__{{ control_name }}.FAIL"
Где path_to_file
- полный путь до файла update_disallowed
.
В этом случае необходимо вручную откатить стенд на исходное состояние (см. раздел «Откат»), удалить файл /home/postgres/.update_pgse/update_disallowed
, а затем перезапустить разведку.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка включения полного внутреннего резервного копирования данных
- Автоматизированная проверка
- Ручная проверка
Проверяется значение параметра is_inner_full_backup
.
Если параметр имеет значение false
, то выводится информационное сообщение:
"{{ control_name }}.WARNING__W03004:Создание локальной резервной копии СУБД было отключено пользователем. Процедура автоматического восстановления СУБД к исходному состоянию в случае непредвиденных ошибок в процессе обновления будет отключена.__{{ control_name }}.WARNING"
Затем производится проверка наличия необходимых Linux-пакетов и, в случае их отсутствия, их установка, подготовка виртуального окружения Python, определение текущего active и standby.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка пути до директории для резервного копирования
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка пути до директории для резервного копирования.
Если обнаружены ошибки при определении пути до директории резервной копии, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03024:Обнаружены ошибки в процессе определения пути до каталога резервной копии. В директории {pgbackup_path} был обнаружен следующий перечень возможных путей '{list_of_dirs}'. Определить точный путь до резервной копии не удалось. Скорректируйте содержимое директории {pgbackup_path}, оставив только актуальный каталог с резервной копией и перезапустите механизм обновления.__{{ control_name }}.FAIL"
Где:
pgbackup_path
- путь до директории для создания РК;list_of_dirs
- список директорий внутриpgbackup_path
.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка учетной записи для резервного копирования
- Автоматизированная проверка
- Ручная проверка
Выполняется следующий запрос к БД:
SELECT pg_roles.rolname FROM pg_roles WHERE rolname='{{ user_for_backup }}';
Где user_for_backup
- имя УЗ для резервного копирования.
Если учетная запись для резервного копирования отсутствует, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03015:Техническая учетная запись {user_for_backup} не используется в процессе резервного копирования. Рекомендуется проверить наличие указанного пользователя в конфигурационном файле компонента или произведите проверку наличия пользователя в БД.__{{ control_name }}.FAIL"
Где user_for_backup
- имя УЗ для резервного копирования.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка, что переданный адрес active соответствует действительности
- Автоматизированная проверка
- Ручная проверка
Производится проверка соответствия роли master
, указанного в файле inventory
, и фактического указания роли master
на стенде.
В случае, если мастер не соответствует переданному в конфигурации hosts.ini
, скрипт прервется с ошибкой:
"{{ control_name }}.FAIL__E03033:В кандидате на обновление текущий мастер в СУБД не соответствует переданному пользователем значению. На текущий момент обновление невозможно, необходимо выполнить switchover.__{{ control_name }}.FAIL"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Получение состояний компонентов для определения типа установленной конфигурации
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка наличия параметра CLNAME
в bash_profile
пользователя postgres.
Если параметр отсутствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03093:Укажите актуальное имя кластера в {} в параметре '- export CLNAME= '__{{ control_name }}.FAIL"
Выполняется проверка наличия всех файлов сертификатов, указанных в пользовательском конфигурационно файле.
Если файлы сертификатов отсутствуют, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E02002:Файл '{path_to_certs}' не найден на хосте {inventory_hostname}. Проверьте наличие файла и значение в кастомном конфигурационном файле - '{path_to_config}'__{{ control_name }}.FAIL"
Где:
path_to_certs
- путь до сертификатов, указанный в пользовательском конфигурационном файле;inventory_hostname
- имя узла стенда;path_to_config
- путь до пользовательского конфигурационного файла.
Скрипты обновления не осуществляют проверку валидности сертификатов.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка соответствия установленных компонентов кластера с текущим типом конфигурации
- Автоматизированная проверка
- Ручная проверка
Выполняется следующий запрос к БД:
SHOW installer.cluster_type;
Результат данного запроса сравнивается со списком установленных компонентов.
Если будут найдены несоответствующие компоненты, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03095:Текущий тип конфигурации, согласно конфигурационному параметру СУБД - {type_of_configuration}, при этом обнаружены несоответствующие конфигурации компоненты: {list_of_components}. Удалите несоответствующие компоненты.__{{ control_name }}.FAIL"
Где:
type_of_configuration
- тип установленной конфигурации;list_of_components
- список несоответствующих компонент.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка минимальной поддерживаемой версии СУБД, над которой может быть выполнен сценарий разведки/обновления
- Автоматизированная проверка
- Ручная проверка
Скрипт запрашивает информацию об установленной версии. Сравнивает версию с параметром, отвечающим за минимальную поддерживаемую версию, который, в свою очередь, берет информацию из матрицы версий.
Если версия не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03017:Обновление невозможно, так как текущая версия ({current_db_version}) не поддерживается. Минимальная поддерживаемая версия: {min_db_version}. Рекомендуется обновиться на промежуточную версию.__{{ control_name }}.FAIL"
Где:
current_db_version
- версия Pangolin, установленная на стенде;min_db_version
- минимально поддерживаемая версия Pangolin для обновления.
Для осуществления обновления вручную необходимо обратиться к администратору.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка поддержки версии Pangolin, на которую планируется обновление
- Автоматизированная проверка
- Ручная проверка
Производится проверка версии экземпляра СУБД Pangolin, на которую планируется обновление с помощью скриптов автоматизации.
Если версия Pangolin, на которую планируется обновление, не поддерживается текущими скриптами автоматизации, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03025:Обновление невозможно, так как версия, на которую производится обновление не поддерживается. Смотрите матрицу обновлений версий СУБД.__{{ control_name }}.FAIL"
Необходимо убедиться что с текущей версии СУБД возможно обновление.
Для этого убедитесь в наличии текущей версии в таблице поддерживаемых версий для обновления.
В случае отсутствия текущей версии в таблице, необходимо будет планировать промежуточное обновление стенда, перед целевым обновлением.
Проверка типа установленной конфигурации Pangolin
- Автоматизированная проверка
- Ручная проверка
Скрипт запрашивает информацию об установленном типе конфигурации и сравнивает его со списком неподдерживаемых.
Если тип конфигурации не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03020:Обновление невозможно из-за установленного типа конфигурации: {configuration_type}. Приведите тип конфигурации к одному из поддерживаемых типов (как за счет чистой установки новой СУБД, так и за счет ручного изменения типа конфигурации).__{{ control_name }}.FAIL"
Где configuration_type
- тип установленной конфигурации.
Список поддерживаемых вариантов конфигурации:
cluster-patroni-etcd-pgbouncer
;standalone-postgresql-only
;standalone-postgresql-pgbouncer
;standalone-patroni-etcd-pgbouncer
.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Определение типа обновления
- Автоматизированная проверка
- Ручная проверка
Скрипт проверки самостоятельно определяет тип обновления по своему алгоритму, без дополнительных действий от пользователя.
Алгоритм действий проверки. На текущей СУБД запрашивается информация:
- текущая версия;
- включена или нет функциональность «Прозрачное защитное преобразование данных (TDE)»;
- включена или нет функциональность «защита от привилегированных пользователей (AP)».
Если тип обновления равен unsupported
для текущей версии, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03026:Обновление в автоматическом режиме при наличии включенных средств защиты информации (TDE, защита конфигурации, защита от привилегированных пользователей) для версии ({current_db_version}) в текущей версии скриптов автоматизации невозможно.__{{ control_name }}.FAIL"
Где current_db_version
- установленная версия СУБД.
Определите тип обновления с помощью таблицы поддерживаемых версий для обновления.
Проверка свободного места
- Автоматизированная проверка
- Ручная проверка
Производится проверка свободного места в точке монтирования PGBACKUP
(пример: /pgarclogs/0{base_version}
). Требуется минимум 1 Гб.
Если места не хватает, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03090:Точка монтирования {PGBACKUP} имеет {current_free_space} Гб свободного пространства, но требуется не менее 1 Гб.__{{ control_name }}.FAIL"
Где current_free_space
- количество свободного места в точке монтирования.
Для обновления с переносом данных выполняется проверка размера СУБД.
Если размер СУБД больше чем задано в параметре maximum_dbms_size_to_update
(параметр максимальный размер СУБД для обновления в настраиваемом конфигурационном файле), то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03038:Автоматическое обновление ограничено размером табличных пространств кластера СУБД в {} Гб. Табличное пространство tbs_name имеет размер {} Гб.__{{ control_name }}.FAIL"
Для обновления с переносом данных и полного внутреннего резервного копирования данных проверяется наличие на active каталога local_backup_path
(путь для локального резервного копирования), задающийся в настраиваемом конфигурационном файле или переданным на вход скрипта в виде --extra-vars
.
Если отсутствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03014:Не найден каталог {local_backup_path}, указанный в качестве каталога для создания локального резервного копирования. Создайте каталог.__{{ control_name }}.FAIL"
Необходимо проверить количество свободного места в точке монтирования PGBACKUP
(пример: /pgarclogs/0{base_version}
).
Для этого выполните следующие команды:
# Получение информации о точках монтирования в директории
mount | grep '<path_to_dir>'
# Получение информации о занятом пространстве для точки монтирования
df -h <path_to_mpoint>
Где:
path_to_dir
- полный путь до каталогаPGBACKUP
path_to_mpoint
- полный путь до точки монтирования
Для точки монтирования PGBACKUP
необходимо не менее 1 Гб свободного пространства.
Проверка свободного места для точки монтирования local_backup_path
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия свободного места для осуществления резервного копирования в директорию local_backup_path
(отображается в логе как «локальный backup»). Данная проверка складывается из следующих параметров:
- Размер кластера СУБД (текущего каталога
pgdata
). - Вычисляется процент от размера кластера СУБД. Процент задается в параметре
local_backup_coefficient
в настраиваемом конфигурационном файле (по умолчанию равен 1%). - 1 Гб, если точка монтирования
local_backup_path
совпала с точкой монтирования дляPGBACKUP
.
Если в точке монтирования для local_backup_path
не хватает места, то выводится ошибка:
"{{ control_name }}.FAIL__E03089:Недостаточно свободного места для локального бэкапа в {local_backup_path}. Доступно {local_backup_path_free_mb} Мб. Требуется >= {pgdata_size_need_mb} Мб.__{{ control_name }}.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
.
Если для указанных точек монтирования будет не хватать места, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E01012:Точка монтирования {dir} имеет {current_free_space} Гб свободного пространства, но требуется не менее {needed_free_space} Гб.__{{ control_name }}.FAIL"
Где:
dir
- точка монтирования;current_free_space
- свободное пространство в точке монтирования;needed_free_space
- необходимый объем свободного пространства в точке монтирования.
Необходимо убедиться в достаточном количестве свободного пространства в точках монтирования, в которых расположены следующие каталоги:
/usr/
;pgdata
;PGBACKUP
;PGLOGS
.
Необходимо по 1 Гб свободного пространства для точек монтирования в которых расположены каталоги:
pgdata
;PGBACKUP
;PGLOGS
.
Необходимо не менее 2 Гб свободного пространства для точки монтирования, в которой находится каталог /usr/
.
Проверка свободного места для PGDATA на реплике
- Автоматизированная проверка
- Ручная проверка
Производится проверка свободного места в каталоге $PGDATA
на реплике.
Если на реплике для $PGDATA
будет недостаточно места, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03043:Недостаточно свободного места в точке монтирования для pgdata на реплике ({replica_hostname}) для выполнения обновления. Доступно свободного места {current_free_space} Мб, требуется {needed_free_space} Мб__{{ control_name }}.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.
В случае если места на точке монтирования будет недостаточно, перед началом обновления его необходимо будет увеличить.
Проверка наличия свободного места для точек монтирования, содержащих табличные пространства
- Автоматизированная проверка
- Ручная проверка
Производится проверка свободного места для табличных пространств.
Если для табличных пространств будет недостаточно места, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03044:Недостаточно свободного места в точке монтирования {mount_name} для выполнения обновления. Доступно свободного места {current_free_space} Мб, требуется {needed_free_space} Мб__{{ control_name }}.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
были обнаружены точки монтирования, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03072:В кандидате на обновление обнаружены точки монтирования в рабочем каталоге /pgdata: {mount_name}. Размонтируйте найденные каталоги для дальнейшего обновления.__{{ control_name }}.FAIL"
Где mount_name
- название точки монтирования.
Проверьте наличие точек монтирования в рабочем каталоге PGDATA
.
Для этого выполните следующую команду:
mount | grep <path_to_catalog>
Где path_to_catalog
- полный путь до рабочего каталога PGDATA
.
Если точки монтирования будут обнаружены, перед началом обновления их необходимо размонтировать.
Проверка точек монтирования
- Автоматизированная проверка
- Ручная проверка
Производится проверка прав для записи в каталоги, которые могут быть точками монтирования - PGDATA
, PGBACKUP
и PGLOGS
.
Если скриптам развертывания не удается выполнить запись в данные каталоги, то выводится ошибка:
"{{ control_name }}.FAIL__E01013:Инсталлятор не может записать файлы в директорию {dir_path}. Проверьте маску директории или назначьте владельца postgres.__{{ control_name }}.FAIL"
Где dir_path
- полный путь до директории.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка консистентности виртуальных сред
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия виртуальных сред по путям, указанным в конфигурационном файле, а также консистентности установленных библиотек в данных виртуальных окружениях.
В случае, если виртуального окружения не существует или в нем отсутствует какая-либо из зависимостей, будет выведено сообщение:
"{{ control_name }}.FAIL__E03075:Не найдена директория со старой версий virutalenv в директории PGHOME на хосте: {inventory_hostname}. Для корректной проверки установите из дистрибутива rpm пакет pangolin-ansible-venv-controlled расположенный в {path_to_rpm} на хосте с которого запускается проверка перед обновлением.__{{ control_name }}.FAIL"
Где:
inventory_hostname
- имя узла стенда;path_to_rpm
- полный путь до rpm-пакета.
После чего утилита развертывания/обновления будет производить установку пакетов в автоматическом режиме.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка наличия корректных прав для каталогов текущая PGDATA, PGBACKUP, local_backup_path
- Автоматизированная проверка
- Ручная проверка
Производится попытка создания тестовых файлов в каталогах PGDATA
, PGBACKUP
, local_backup_path
под пользователя postgres.
Если создать данные файлы не удается, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03029:Пользователь postgres должен иметь rwx права на каталог '{dir_path}'. Приведите права на каталог к целевому виду.__{{ control_name }}.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
, пользовательского конфигурационного файла, указан некорректный путь, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03083:Путь для сохранения локального бэкапа не должен находиться в /pgdata, /pgdata[0-99] или содержать кириллицу.__{{ control_name }}.FAIL"
Если в параметре local_backup_path
, пользовательского конфигурационного файла, указан путь до каталога, в котором находят табличные пространства, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03084:Локальный бэкап не может находиться в каталоге с табличным пространством.__{{ control_name }}.FAIL"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка корректности расположения служб, при включенной функциональности «Отказ от root» в процессе эксплуатации
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка местоположения служб текущей версии Pangolin.
Если какая-либо служба будет находиться в системном каталоге служб, в то время, как все остальные находятся в пользовательском каталоге, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03078:Служба {service_list} находится в системном каталоге служб, так как другие компоненты находятся в пользовательской директории служб. Для продолжения мигрируйте сервисный файл в директорию пользователя.__{{ control_name }}.FAIL"
Где service_list
- список сервисов, находящихся в системном каталоге служб.
Данная проверка выполняется только в случае включенной функциональности «Отказ от root».
Необходимо убедиться что все службы находятся в пользовательском каталоге.
Для этого выполните следующую команду под пользователем postgres для каждой службы, использующейся в СУБД:
systemctl status --user <service_name>
Где service_name
- название службы.
Проверка состояния служб
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка состояния служб текущей версии СУБД Pangolin.
Если какая-либо служба, необходимая для корректной работы СУБД будет выключена, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03079:Служба {service_name} не запущена. Проверьте состояние сериса__{{ control_name }}.FAIL"
Где service_name
- название службы.
Проверьте состояние служб СУБД Pangolin. Для этого на всех узлах экземпляра СУБД выполните следующую команду от имени суперпользователя:
#если сервис был запущен от имени суперпользователя
systemctl status <service_name>
#если сервис был запущен от пользователя postgres
su - postgres
systemctl status --user <service_name>
Где service_name
- имя службы.
В стандартных конфигурациях список служб для узлов следующий:
-
Мастер, реплика:
postgresql
(для конфигурацииstandalone
);pangolin-pooler/pgboincer
;pangolin-manager/patroni
(для конфигурацииcluster
);etcd
(если был установлен).
-
Арбитр:
pangolin-manager/etcd
.
Проверка структуры каталогов PGDATA
- Автоматизированная проверка
- Ручная проверка
Скрипт запрашивает структуру каталогов на active и standby для кластерной конфигурации.
Если структура каталогов отличается, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03036:Разная структура каталогов в каталоге pgdata на серверах. Структура pgdata должна быть одинаковой на мастере и реплике. Со структурой можно ознакомиться в логе задачи (имя таски: pgdata directory structure).__{{ control_name }}.FAIL"
Необходимо убедиться в идентичности структуры каталогов PGDATA
на мастере и на реплике.
Для этого выполните следующие действия:
-
Получите структуру каталога
PGDATA
на мастере и на реплике с помощью следующей команды:find <path_to_pgdata> -type d
Где
path_to_pgdata
- полный путь до каталогаPGDATA
. -
Сравните полученные структуры друг с другом, они должны быть одинаковые.
Проверка символических ссылок в PGDATA
- Автоматизированная проверка
- Ручная проверка
Скрипт запрашивает на active и standby список всех символических ссылок в каталоге PGDATA
и определяет куда они направлены.
Если символические ссылки отличаются, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03037:Отличаются символические ссылки в каталоге pgdata на серверах. Приведите символические ссылки к целевому виду. Со списком символических ссылок можно ознакомиться в логе задачи (имя таски: symlinks in pgdata).__{{ control_name }}.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_backup', 'pg_standby', 'protected_dump', 'pg_profile', 'orafce', 'pg_squeeze', 'pg_cron', 'pg_repack', 'pgse_backup', 'pg_hint_plan', \
'pg_outline', 'oracle_fdw', 'tds_fdw', 'psql_lockmon', 'pg_stat_kcache', 'psql_rotate_password', 'fasttrun', 'fulleq', 'mchar', \
'psql_diagpack', 'pg_store_plans', 'pg_orphaned', 'psql_resources_consumption_limits'"
Расширения (pg_background
, postgis
, pgrouting
, pgq
, pgq_coop
, pgqd
, pgsql-http
, pldebugger
, plpgsql_check
, pgcopydb
, pgloader
), не входящие в состав Pangolin, не поддерживаются скриптами автоматического обновления.
Для обновления исполняемых файлов, в поддерживаемые, добавляется расширение: timescaledb
.
Если список не пустой, то:
-
для обновления исполняемых файлов выводится предупреждающее сообщение:
"{{ control_name }}.WARNING__W03001:Текущая версия СУБД содержит расширения, не входящие в состав Pangolin (<имя базы>.<имя схемы>.<имя расширения>): {extension_list}. После обновления проверьте работу расширений.__{{ control_name }}.WARNING"
Где
extension_list
- список неподдерживаемых расширений. -
для обновления с переносом данных выводится не блокирующая выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03019:Текущая версия СУБД содержит расширения, не входящие в состав Pangolin или для данных расширений обновление не поддерживается. (<имя базы>.<имя схемы>.<имя расширения>): {extension_list} Удалите данные расширения.__{{ control_name }}.FAIL"
Где:
list_of_extensions
- список неподдерживаемых расширений в параметреshared_preload_libraries
;inventory_hostname
- наименование узла стенда.
Если неподдерживаемое расширение находится в параметре shared_preload_libraries
:
"{{ control_name }}.FAIL__E03069:В кандидате на обновление обнаружены неподдерживаемые расширения {list_of_extensions} в параметре shared_preload_libraries на хосте {inventory_hostname}.__{{ control_name }}.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
, будет выведена ошибка, блокирующая выполнение сценария:
"{{ control_name }}.FAIL__E03092:Обновление невозможно, так как активна сессия снятия РК внешней службой. Дождитесь окончания снятия РК со стенда__{{ control_name }}.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`
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка минимальной конфигурации CPU и RAM на обновляемых стендах
- Автоматизированная проверка
- Ручная проверка
Проверка осуществляется путем сбора системных параметров стенда и сравнения с минимальными значениями, указанными в файле конфигурации custom_file_template.yml
.
Если проверка обнаружила несоответствие минимальным требованиям, будет выдана ошибка:
"{{ control_name }}.FAIL__E03047:Хост {inventory_hostname} не соответствует минимальным требованиям по CPU. Минимальное количество ядер: {min_cpu}.__{{ control_name }}.FAIL"
"{{ control_name }}.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
Проверка достаточного количества оперативной памяти необходимой для обновления
- Автоматизированная проверка
- Ручная проверка
Проводится проверка достаточного количества оперативной памяти необходимой для обновления.
Если оперативной памяти будет недостаточно, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03034:В кандидате на обновление обнаружен недостаток свободной оперативной памяти. Для успешного выполнения операции разведки и последующего обновления shared_buffers тестовой базы необходимо не менее {need_ram} ГБ или не менее {need_percent_ram}% свободной оперативной памяти. Сейчас доступно {free_ram} ГБ.____{{ control_name }}.FAIL"
Где:
need_ram
- необходимое количество свободной оперативной памяти, Гб;need_percent_ram
- процент необходимой свободной оперативной памяти;free_ram
- текущее количество свободной оперативной памяти.
Необходимо проверить количество свободной оперативной памяти.
Для этого выполните команду:
free -h
Обратите внимание на столбцы total
и available
. Если общее количество оперативной памяти меньше 64 Гб, то для обновления необходимо минимум 4 Гб свободной памяти, иначе - 8 Гб.
Проверка одинаковой конфигурации узлов мастера и реплики
- Автоматизированная проверка
- Ручная проверка
Проверка осуществляется путем сбора системных параметров мастера и реплики и сравнение их друг с другом.
Если проверка обнаружила несоответствие, будет выведена ошибка:
"{{ control_name }}.FAIL__E03049:Количество ядер CPU на мастере не соответствует количеству ядер CPU на реплике.__{{ control_name }}.FAIL"
"{{ control_name }}.FAIL__E03050:Количество оперативной памяти на мастере не соответствует количетву оперативной памяти на реплике.__{{ control_name }}.FAIL"
Необходимо убедиться, что на мастере и на реплике одинаковые системные характеристики в части количества ядер CPU и оперативной памяти.
Для этого выполните следующие команды на мастере и на реплике:
-
Получение информации о количестве ядер CPU:
nproc
-
Получение общего количества оперативной памяти (обратить внимание на столбец
total
):free -h
Проверка наличия установленных пакетов Pangolin разной версии
- Автоматизированная проверка
- Ручная проверка
Происходит проверка наличия установленных пакетов platform-v-pangolin
и postgresql-sber-edition
.
Если оба пакета установлены, то будет выведено сообщение:
"{{ control_name }}.FAIL__E03051:На стенде установлены несколько пакетов Pangolin: platform-v-pangolin-dbms и postgresql-sber-edition. Удалите неактуальный пакет.__{{ control_name }}.FAIL"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка существования файлов блокирующих обновление
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка наличия файлов, блокирующих обновление.
Если во время повторного запуска обновления, были найдены файлы блокирующие обновление (disallow_update
или .trigger_stop_update
), то в зависимости от установленного рычага remove_block_update_tmp_files
в конфигурационном файле они могут быть удалены.
Если рычаг remove_block_update_tmp_files
выставлен в true
, данные файлы будут автоматически удалены. После удаления будет выведено сообщение об удалении данных файлов:
"{{ control_name }}.INFO__I03003:Был найден и удален триггер прерывания обновления '{path_to_trigger}'.__{{ control_name }}.INFO"
"{{ control_name }}.INFO__I03004:Был найден и удален файл предыдущего неудачного обновления '{path_to_block_file}'.__{{ control_name }}.INFO"
Где:
path_to_trigger
- полный путь до триггера, блокирующего обновление;path_to_block_file
- полный путь до файла, блокирующего обновление.
Если рычаг remove_block_update_tmp_files
выставлен в false
, данные файлы удалены не будут. В этом случае будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03022:Зафиксирован принудительный откат пользователем СУБД Pangolin. Перед перезапуском обновления удалите файл {filename}.__{{ control_name }}.FAIL"
Где filename
- полный путь до файла, блокирующего обновление.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка наличия утилиты vi на стенде:
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия утилиты vi на узлах стенда.
Если утилита vi отсутствует, будет выведено следующее предупреждающее сообщение:
"{{ control_name }}.WARNING__W01002:Утилита vi не обнаружена. Отсутствие данной утилиты делает невозможным использование alias hba для пользователя postgres. После установки/обновления БД необходимо изменить данный алиас на используемый в системе редактор.__{{ control_name }}.WARNING"
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка установленного пакета СУБД Pangolin версии, на которую планируется обновление
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия установленного пакета СУБД Pangolin версии, на которую планируется обновление.
Если скриптом-разведчиком будет обнаружен подобный пакет, то выводится ошибка:
"{{ control_name }}.FAIL__E03052:На стенде установлен пакет Pangolin версии 6.5.2, на которую планируется обновление. Удалите данный пакет.__{{ control_name }}.FAIL"
Где version
- версия установленного на стенд пакета.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка соответствия установленных версий Pangolin на узлах стенда
- Автоматизированная проверка
- Ручная проверка
Производится проверка идентичности версий установленных пакетов Pangolin на узлах стенда.
Если будет зафиксирован несоответствие установленных версий Pangolin между узлами стенда, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03076:Зафиксировано несоответствие установленных версий Pangolin между узлами кластера.__{{ control_name }}.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>-sberlinux8 @@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 6.4.3-sberlinux8 @@commandline
pangolin-dbms-<version>-client.x86_64 6.4.3-sberlinux8 @@commandlineГде
version
- версия компонента.
Проверка наличия необходимых компонентов на всех узлах стенда
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия всех необходимых компонентов на всех узлах стенда.
Если проверка наличия необходимых компонентов не пройдена, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03002:На узлах не совпадет тип развертывания для компонента {name_of_component}. Для продолжения обновления необходимо, чтобы наличие компонента и его версия совпадали на всех узлах.__{{ control_name }}.FAIL"
Если не пройдена проверка наличия одинаковых версий компонентов на всех узлах стенда, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03003:На узлах обнаружены различные версии компонента {name_of_component}. Для продолжения обновления необходимо, чтобы версии компонента на всех узлах совпадали.__{{ control_name }}.FAIL"
Где name_of_component
- название проблемного компонента.
Проверку необходимо провести при наличии кластерной конфигурации.
Нужно проверить что на мастере и на реплике установлены следующие компоненты:
pangolin-manager
;pangolin-pooler
;pangolin-backup-tools
.
В случае отсутствия какого-либо из указанных компонентов, перед обновлением необходимо его установить на проблемном узле.
Проверка возможности обновления компонента pangolin-backup-tools
- Автоматизированная проверка
- Ручная проверка
Производится проверка возможности обновления компонента pangolin-backup-tools
.
Если проверка не пройдена, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03004:Обновление компонента 'pangolin-backup-tools' невозможно, ввиду некорректной предыдущей установки.__{{ control_name }}.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
не будет найден, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03056:На хосте '{inventory_hostname}' для компонента '{name_of_component}' не удалось обнаружить конфигурационный файл {path_to_config}. Необходимо проверить корректность настройки на стенде компонента {name_of_component}.__{{ control_name }}.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
не соответствуют друг другу на мастере и на реплике, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03057:Обнаружено несоответствие настроек компонента 'pangolin-backup-tools' на нодах кластера. Необходимо привести состяния стенда на всех нодах к одному состоянию.__{{ control_name }}.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
, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03059:На хосте '{inventory_hostname}' для компонента '{name_of_component}' был обнаружен не весь набор рабочих файлов. Необходимо проверить корректность настройки на стенде компонента {name_of_component}.__{{ control_name }}.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
.
Будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03091:На узле '{inventory_hostname}' для компонента '{name_of_component}' в процессе проверки содержимого рабочего файла '{path_to_config}' не удалось обнаружить следующие значения в нем: '{name_of_parameters}'. Произведите проверку содержимого фалйла и добавьте недостающие значения.__{{ control_name }}.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
, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03005:Расширение pg_cron не должно быть установлено в базу данных template0. Удалите расширение из template0.__{{ control_name }}.FAIL"
Если расширение pg_cron
установлено в нескольких базах данных, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03006:Текущая СУБД содержит инсталляции расширения pg_cron в нескольких баз данных. (<имя базы>.<имя схемы>.<имя расширения>): \ {database_name}. Расширение должно быть установлено только в одной баз данных, имя которой указано именем в параметре cron.database_name. Удалите расширение из других баз данных.__{{ control_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
При не успешном прохождении проверки, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03045:Не прошла проверка доступа к базе данных с использованием засереченного хранилища паролей (pg_auth_config check), на стенде {inventory_hostname}. Ознакомьтесь с логами.__{{ control_name }}.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.
Если каталоги отличаются, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"{{ control_name }}.FAIL__E03077:Зафиксировано несоответствие директории {path_to_dir} между узлами кластера. Необходимо произвести их корректировку__{{ control_name }}.FAIL"
Где path_to_dir
- путь до проблемной директории.
Необходимо проверить, что в файле .bash_profile
пользователя postgres содержаться одинаковые переменные и их значения.
Нужно убедиться в наличии следующих переменных:
PGHOME_CLIENT
- путь до каталога с клиентской частью СУБД;PGHOME
- содержит полный путь до каталога установки СУБД.
Для проверки наличия данных переменных и получения их значений, выполните под пользователем postgres, на каждом узле стенда, следующие команды:
echo $PGHOME_CLIENT
echo $PGHOME
Полученные значения необходимо сравнить между всеми узлами стенда. В случае, если значения не совпадут, на проблемном узле необходимо скорректировать путь до каталога и возможно переместить сам каталог.
Проверка корректности установки расширения pg_profile
- Автоматизированная проверка
- Ручная проверка
Производится проверка корректности установки расширения pg_profile
.
Если расширение pg_profile
установлено в некорректную схему БД, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03018:Обновление невозможно. Расширение 'pg_profile' должно быть установлено в схеме 'pgse_profile'. Текущее значение: {name_of_schema}. __{{ control_name }}.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, будет выведена следующая ошибка:{{ control_name }}.FAIL__E03085:Обновление с установленным расшрением timescaledb версии {current_version} не поддерживается. Необходимо обновить расширение до версии {needed_version}. Если поднятие версии расширения не представляется возможным, необходимо произвести промежуточное обновление СУБД до версии 5.5.4.__{{ control_name }}.FAIL"
{{ control_name }}.FAIL__E03110: Обновление с установленным расшрением timescaledb версии {current_version} невозможно. Необходимо произвести обновление до минимальной версии 6.1.7 или 6.3.0__{{ control_name }}.FAILГде:
current_version
- текущая версия расширенияtimescaledb
;needed_version
- необходимая версия расширенияtimescaledb
;
-
Если на стенде установлено расширение
timescaledb
с неподдерживаемой лицензией, будет выведена следующая ошибка:"{{ control_name }}.FAIL__E03086:В БД используется расширение timescaledb с неподдерживаемой лицензией {type_of_license}.__{{ control_name }}.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
на предмет возможности его обновления.
Если обновление данного расширения не поддерживается, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03104:Версии расширения anon из дистрибутива и БД: {current_version} не совпадают. Обновление расширения не поддерживается.__{{ control_name }}.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
заполнен некорректно, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03107:Обнаружено некорректное заполнение параметра shared_preload_libraries в конфгурационном файле postgresql.conf. Строка со значением параметра shared_preload_libraries в конфигурационном файле postgresql.conf не может заканчиваться запятой.__{{ control_name }}.FAIL"
Необходимо убедиться в корректности заполнения параметра shared_preload_liraries
в конфигурационном файле.
Для этого выполните следующую команду:
cat <path_to_config> | grep 'shared_preload_liraries'
Где path_to_config
- полный путь до конфигурационного файла СУБД.
Полученная строка не может заканчиваться запятой, в противном случае необходимо скорректировать заполнение данного параметра.
Проверка соответствия информации об узлах кластера в конфигурационном файле и на самих узлах
- Автоматизированная проверка
- Ручная проверка
Производится проверка соответствия между DNS записями узлов в конфигурационном файле СУБД и DNS записями на самих узлах.
Если в конфигурационном файле обнаружено несоответствие DNS записей с узлами кластера, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03087:В конфигурационном файле {path_to_config} на хосте {inventory_hostname}, присутствует несоответствие DNS записей с хостами кластера__{{ control_name }}.FAIL"
Где:
path_to_config
- путь до конфигурационного файла;inventory_hostname
- наименование узла стенда.
Если в настройке кластера используются полные доменные имена узлов, необходимо убедиться в том, что в конфигурационном файле postgres.yml
используются корректные FQDN узлов.
Проверка наличия дубликатов параметров в конфигурационном файле
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия дублирующих параметров в конфигурационном файле postgres.yml
.
Если в конфигурационном файле pangolin-manager
обнаружены дубликаты параметров, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03010:В файле {path_to_config}/postgres.yml найдены параметры: {list_of_parameters}, имеющие дубли. Удалите дубликаты параметров из конфигурационного файла.__{{ control_name }}.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
(при кластерной конфигурации).
Если подобные символы будут обнаружены, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03032:В файле {path_to_config} найден символ unicode. Необходимо скорректировать конфигурационный файл.__{{ control_name }}.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, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03046:В конфигурационном файле postgresql.conf присутствуют дополнительные include из {include_file}. Перенесите конфигурационные параметры из {include_file} в postgres.conf и запустите проверку повторно.__{{ control_name }}.FAIL"
Где include_file
- список подключенный к postgresql.conf
файлов.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка количества созданных табличных пространств
- Автоматизированная проверка
- Ручная проверка
Производится проверка количества созданных табличных пространств.
Если количество созданных табличных пространств больше или равно значению параметра disk_check_tablespaces_count
, указанному в конфигурационном файле, будет выведена следующая ошибка:
"{{ control_name }}.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.__{{ control_name }}.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 в конфигурационном файле.
Если в конфигурационном файле параметры не обнаружены, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03068:Обновление невозможно, так как не удалось обнаружить параметры {parameter_names} в локальном конфигурационном файле баз данных {path_to_config}. Приведите файл в актуальное состояние, добавив необходимые настроечные параметры SSL и повторите запуск скрипта разведчика.__{{ control_name }}.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 -v -d db_name (запуск очистки базы данных ), где db_name - имя БД из списка.
Список БД: {list_of_databases}.WARNING"
Где list_of_databases
- список баз данных, в которых обнаружено большое количество незавершенных транзакций.
Пороговое количество транзакций определено исходя из максимального количества записей, которые могут содержаться в одном журнале и количества самих журналов (эмпирически определено как три).
Необходимо убедиться в том, что в БД присутствует небольшое количество транзакций с незавершенным статусом.
Для этого подключитесь к каждой БД и выполните следующий SQL-запрос:
SELECT * FROM (WITH mysql AS (SELECT * FROM pg_stat_database) SELECT db.datname, (mysql.xact_commit::text::bigint - datfrozenxid::text::bigint) / 1048576 AS clog_cnt FROM pg_database db, mysql WHERE db.oid=mysql.datid) mysql2 WHERE clog_cnt>3;
Если в результате выполнения запроса будет получен не пустой ответ, то для данной БД, перед обновлением необходимо выполнить следующую команду:
vacuumdb -v -d <db_name>
Где db_name
- имя БД, в которой обнаружено большое количество транзакций с незавершенным статусом.
Проверки для обновления с переносом данных
При данном типе обновления выполняются все проверки из блока «Проверки для всех типов обновлению», а также проверки перечисленные в данном блоке.
Запуск процесса заморозки
- Автоматизированная проверка
- Ручная проверка
Перед началом обновления, с помощью скриптов автоматизации, будет произведен запуск процесса VACUUM FREEZE
, что приведет к заморозке всех блоков данных, не входящих в карту заморозки. Параллельно будет сброшен каждый обработанный блок. Данное действие выполняется для минимизации последствий, вызванных изменением счетчика транзакций на версиях 6.x.x.
Будет выведено одно из следующих предупреждений:
-
Будет запущен процесс очистки (если значение параметра
vacuum_freeze_before_update: true
или оставлено значение по умолчанию):"{{ control_name }}.WARNING__W03011:Перед обновлением СУБД будет запущен VACUUM FREEZE. Он заморозит все данные, которые не были заморожены пользователем при подготовке стенда к обновлению, что потенциально может привести к отставанию реплики, инцидентам производительности и переполнениям ФС. Перед обновлением рекомендуется настроить параметр vacuum_freeze_process.timeout с учетом длительности технологического окна и размера незамороженных таблиц. Для минимизации негативных последствий рекомендуется запустить процесс заморозки непосредственно перед обновлением, в режиме отсутствия транзакционной нагрузки на СУБД. Пример команды заморозки: 'vacuumdb -F -a -j <количество потоков>' .__{{ control_name }}.WARNING"
-
Процесс очистки не будет запущен (был изменен параметр
vacuum_freeze_before_update
на значениеfalse
):"{{ control_name }}.WARNING__W03012:Процесс VACUUM FREEZE не будет запущен перед обновлением СУБД, что потенциально может привести к потере данных. Настоятельно рекомендуется установить значение параметра vacuum_freeze_before_update в 'true' в кастомном конфигурационном файле. А так же настроить параметр vacuum_freeze_process.timeout с учетом длительности технологического окна и размера незамороженных таблиц. Кроме того, для минимизации негативных последствий рекомендуется запустить процесс заморозки непосредственно перед обновлением, в режиме отсутствия транзакционной нагрузки на СУБД. Пример команды заморозки: 'vacuumdb -F -a -j <количество потоков>' .__{{ control_name }}.WARNING"
-
Если произойдет истечение тайм-аута, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E05024:Операция VACUUM FREEZE не успела завершиться - истек тайм-аут. После отката выполните заморозку таблиц вручную, на узле мастера командой 'vacuumdb -F -a -j <количество потоков>' или увеличьте тайм-аут в конфигурационном файле в переменной vacuum_freeze_process.timeout. После этого повторите попытку обновления. Текущее значение тайм-аута в минутах - '{}'.__{{ control_name }}.FAIL
-
Либо аналогичная ошибка, если причина неизвестна:
"{{ control_name }}.FAIL__E05025:Операция VACUUM FREEZE завершилась некорректно, текст ошибки '{}'.__{{ control_name }}.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/0{base_version}/data)
PGBACKUP (пример: /pgarclogs/0{base_version})
local_backup_path (пример: /pgarclogs)
Для обновления с переносом данных, типы файловой системы для каталогов должны совпадать.
Если типы файловой системы не равны, то выводится блокирующая дальнейшее выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03035:Для продолжения обновления необходимо, чтобы директории с текущей pgdata, новой pgdata, pgbackup и {local_backup_path} находились в одной файловой системе. Тип файловой системы: текущая pgdata: {pgdata_old_filesystem}, новая pgdata: {pgdata_new_filesystem}, pgbackup: {pgbackup_filesystem}, local_backup_path: {local_backup_filesystem}.__{{ control_name }}.FAIL"
Где:
local_backup_path
- путь до директории с локальной резервной копией;pgdata_old_filesystem
- тип файловой системы в каталоге текущейPGDATA
;pgdata_new_filesystem
- тип файловой системы в каталоге новойPGDATA
;pgbackup_filesystem
- тип файловой системы в каталогеPGBACKUP
;local_backup_filesystem
- тип файловой системы в каталоге локальной резервной копии.
Необходимо убедиться что типы файловых систем для следующих каталогов совпадают. Список каталогов:
- текущая
PGDATA
(пример:/pgdata/0{base_version}/data
); - новая
PGDATA
(пример:/pgdata/0{base_version}/data
); PGBACKUP
(пример:/pgarclogs/0{base_version}
);local_backup_path
(пример:/pgarclogs
).
Для этого выполните следующие команды на всех узлах обновляемого стенда:
df -T /pgdata/0{base_version}/data
df -T /pgarclogs/0{base_version}
df -T /pgarclogs
Где base_version
- первая цифра текущей версии СУБД.
Проверка наличия ссылок/директорий, необходимых для обновления
- Автоматизированная проверка
- Ручная проверка
Осуществляются проверки наличия ссылок/директорий, используемых в процессе обновления.
-
Если на стенде существует директория, используемая для переноса данных после миграции, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03039:Уже существует директория {new_pgdata_tmp} для переноса данных после миграции. Удалите директорию для дальнейшего обновления.__{{ control_name }}.FAIL"
Где
new_pgdata_tmp
- полный путь до директории в которую планируется перенос данных после миграции. -
Если на стенде существует директория, используемая для создания резервной копии, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03040:Уже существует директория {local_backup_path}, в которой будут созданы резервные копии обновляемой базы данных. Удалите или переименуйте директорию для дальнейшего обновления.__{{ control_name }}.FAIL"
Где
local_backup_path
- директория до нового каталога, необходимого для создания локальной резервной копии. -
Если на стенде существуют директории, используемые для работы СУБД после обновления, будут выведены следующие ошибки:
-
Если существует директория для новой
PGDATA
:"{{ control_name }}.FAIL__E03041:Уже существует директория /pgdata/{new_pgdata_dir}, которая будет использоваться после обновления. Удалите или переименуйте директорию для дальнейшего обновления.__{{ control_name }}.FAIL"
Где
new_pgdata_dir
- директория до каталога с новой PGDATA. -
Если существует директория для
pgbackup
:"{{ control_name }}.FAIL__E03042:Уже существует директория {new_pgbackup_dir}, которая будет использоваться после обновления. Удалите или переименуйте директорию для дальнейшего обновления.__{{ control_name }}.FAIL"
Где
new_pgbackup_dir
- директория до нового каталогаpgbackup
.
-
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка не поддерживаемых типов данных
- Автоматизированная проверка
- Ручная проверка
Выполняется запрос к БД:
SELECT format('%1$s.%2$s(%3$s)',ns.nspname,cl.relname,att.attname) tbl_fld
FROM pg_attribute att
JOIN pg_type tp ON att.atttypid =tp.oid
JOIN pg_class cl ON att.attrelid =cl.oid
JOIN pg_namespace ns ON cl.relnamespace = ns.oid
WHERE tp.typname IN ('abstime','reltime','tinterval') AND NOT (ns.nspname SIMILAR TO '(pg_|information_schema)%');
Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03011:Удалена поддержка типов данных abstime, reltime, tinterval. В базе данных обнаружены таблицы, которые не будут поддерживаться после обновления. Список таблиц, использующих их (<имя схемы>.<имя таблицы>(<имя колонки>)): {list_of_tables}. В качестве альтернативы для abstime можно рассмотреть timestamp или timestamptz, для reltime daterange или tstzrange, tinterval может быть заменен на interval.__{{ control_name }}.FAIL"
Где list_of_tables
- список таблиц.
Необходимо убедиться в том, что в СУБД отсутствуют более неподдерживаемые типы данных.
Для этого необходимо подключиться к БД и выполнить следующий запрос:
SELECT format('%1$s.%2$s(%3$s)',ns.nspname,cl.relname,att.attname) tbl_fld
FROM pg_attribute att
JOIN pg_type tp ON att.atttypid =tp.oid
JOIN pg_class cl ON att.attrelid =cl.oid
JOIN pg_namespace ns ON cl.relnamespace = ns.oid
WHERE tp.typname IN ('abstime','reltime','tinterval') AND NOT (ns.nspname SIMILAR TO '(pg_|information_schema)%');
В случае обнаружения неподдерживаемых типов необходимо от них избавиться. В качестве альтернативы для abstime
можно рассмотреть timestamp
или timestamptz
, для reltime
- daterange
или tstzrange
, tinterval
может быть заменен на interval
.
Проверка массива типов из information_schema
- Автоматизированная проверка
- Ручная проверка
Выполняется запрос к БД:
SELECT format('%1$s.%2$s(%3$s)',ns.nspname,cl.relname,att.attname) tbl_fld
FROM pg_attribute att
JOIN pg_type tp ON att.atttypid =tp.oid
JOIN pg_class cl ON att.attrelid =cl.oid
JOIN pg_namespace ns ON cl.relnamespace = ns.oid
WHERE tp.typname IN ('cardinal_number','character_data','sql_identifier','time_stamp','yes_or_no') AND NOT (ns.nspname SIMILAR TO '(pg_|information_schema)%');
Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03012:Не поддерживаются массивы типов из information_schema, которые содержат запрещенные типы данных, такие abstime, reltime, tinterval. Список таблиц, использующих их (<имя схемы>.<имя таблицы>(<имя колонки>)): {list_of_tables}. Необходимо заменить запрещенные типы данных на разршенные: для abstime можно рассмотреть timestamp или timestamptz, для reltime daterange или tstzrange, tinterval может быть заменен на interval.__{{ control_name }}.FAIL"
Где list_of_tables
- список таблиц.
Необходимо убедиться в том, что в СУБД отсутствуют более неподдерживаемые массивы типов из information_schema
, содержащие запрещенные типы данных.
Для этого подключитесь к БД и выполните следующий SQL-запрос:
SELECT format('%1$s.%2$s(%3$s)',ns.nspname,cl.relname,att.attname) tbl_fld
FROM pg_attribute att
JOIN pg_type tp ON att.atttypid =tp.oid
JOIN pg_class cl ON att.attrelid =cl.oid
JOIN pg_namespace ns ON cl.relnamespace = ns.oid
WHERE tp.typname IN ('cardinal_number','character_data','sql_identifier','time_stamp','yes_or_no') AND NOT (ns.nspname SIMILAR TO '(pg_|information_schema)%');
Если в данный запрос вернет не пустой результат, то необходимо заменить запрещенные типы данных на разрешенные: для abstime
можно рассмотреть timestamp
или timestamptz
, для reltime
- daterange
или tstzrange
, tinterval
может быть заменен на interval
.
Проверка отсутствия не поддерживаемых функций
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка наличия функций неподдерживаемых в новой версии Pangolin.
Если в процессе проверки обнаружены подобные функции, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03080:Зафиксированы функции, которые не поддерживаются в новой версии Pangolin. Список функций: {list_of_functions}__{{ control_name }}.FAIL"
Где list_of_functions
- список неподдерживаемых функций.
Необходимо убедиться в отсутствии устаревших функций.
Для этого подключитесь к каждой БД и выполните следующий SQL-запрос:
WITH pc(proname,proargs,proresult,proacl,proowner) AS (
SELECT pc.proname,pg_get_function_arguments(pc.oid),pg_get_function_result(pc.oid),pc.proacl,pc.proowner::regrole::text FROM pg_proc pc),
depr(proname,proargs) AS (
VALUES
('abstime','timestamp without time zone'), -- {463}
('abstime','timestamp with time zone'), -- {463}
('abstimeeq','abstime, abstime'), -- {463}
('abstimege','abstime, abstime'), -- {463}
('abstimegt','abstime, abstime'), -- {463}
('abstimein','cstring'), -- {463}
('abstimele','abstime, abstime'), -- {463}
('abstimelt','abstime, abstime'), -- {463}
('abstimene','abstime, abstime'), -- {463}
('abstimeout','abstime'), -- {463}
('abstimerecv','internal'), -- {463}
('abstimesend','abstime'), -- {463}
('array_append','anyarray, anyelement'), -- {463,550}
('array_cat','anyarray, anyarray'), -- {463,550}
('array_position','anyarray, anyelement'), -- {463,550}
('array_position','anyarray, anyelement, integer'), -- {463,550}
('array_positions','anyarray, anyelement'), -- {463,550}
('array_prepend','anyelement, anyarray'), -- {463,550}
('array_remove','anyarray, anyelement'), -- {463,550}
('array_replace','anyarray, anyelement, anyelement'), -- {463,550}
('ascii_to_mic','integer, integer, cstring, internal, integer'), -- {463}
('ascii_to_utf8','integer, integer, cstring, internal, integer'), -- {463}
('big5_to_euc_tw','integer, integer, cstring, internal, integer'), -- {463,550}
('big5_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('big5_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('binary_upgrade_set_next_toast_pg_type_oid','oid'), -- {463,550}
('btabstimecmp','abstime, abstime'), -- {463}
('btreltimecmp','reltime, reltime'), -- {463}
('bttintervalcmp','tinterval, tinterval'), -- {463}
('close_lb','line, box'), -- {463,550}
('close_sl','lseg, line'), -- {463,550}
('currtid','oid, tid'), -- {463,550}
('date','abstime'), -- {463}
('date_part','text, reltime'), -- {463}
('date_part','text, abstime'), -- {463}
('dist_bl','box, line'), -- {550}
('dist_lb','line, box'), -- {463,550}
('euc_cn_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_cn_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_jis_2004_to_shift_jis_2004','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_jis_2004_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_jp_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_jp_to_sjis','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_jp_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_kr_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_kr_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_tw_to_big5','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_tw_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('euc_tw_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('gb18030_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('gbk_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('get_bit','bytea, integer'), -- {463}
('interval','reltime'), -- {463}
('interval_transform','internal'), -- {463}
('intinterval','abstime, tinterval'), -- {463}
('isfinite','abstime'), -- {463}
('iso8859_1_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('iso8859_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('iso_to_koi8r','integer, integer, cstring, internal, integer'), -- {463,550}
('iso_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('iso_to_win1251','integer, integer, cstring, internal, integer'), -- {463,550}
('iso_to_win866','integer, integer, cstring, internal, integer'), -- {463,550}
('johab_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('koi8r_to_iso','integer, integer, cstring, internal, integer'), -- {463,550}
('koi8r_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('koi8r_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('koi8r_to_win1251','integer, integer, cstring, internal, integer'), -- {463,550}
('koi8r_to_win866','integer, integer, cstring, internal, integer'), -- {463,550}
('koi8u_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('lag','anyelement, integer, anyelement'), -- {463,550}
('latin1_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('latin2_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('latin2_to_win1250','integer, integer, cstring, internal, integer'), -- {463,550}
('latin3_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('latin4_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('lead','anyelement, integer, anyelement'), -- {463,550}
('max','abstime'), -- {463}
('mic_to_ascii','integer, integer, cstring, internal, integer'), -- {463}
('mic_to_big5','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_euc_cn','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_euc_jp','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_euc_kr','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_euc_tw','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_iso','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_koi8r','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_latin1','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_latin2','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_latin3','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_latin4','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_sjis','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_win1250','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_win1251','integer, integer, cstring, internal, integer'), -- {463,550}
('mic_to_win866','integer, integer, cstring, internal, integer'), -- {463,550}
('min','abstime'), -- {463}
('mktinterval','abstime, abstime'), -- {463}
('numeric_fac','bigint'), -- {463,550}
('numeric_transform','internal'), -- {463}
('opaque_in','cstring'), -- {463}
('opaque_out','opaque'), -- {463}
('path_center','path'), -- {463,550}
('pg_backup_start_time',''), -- {463,550}
('pg_create_logical_replication_slot','slot_name name, plugin name, temporary boolean DEFAULT false'), -- {463,550}
('pg_is_in_backup',''), -- {463,550}
('_pg_keysequal','smallint[], smallint[]'), -- {463}
('pg_terminate_backend','integer'), -- {463,550}
('pm_grant_to_policy','policy_name name, db_name name, object_kind name, object_name name, actions anyarray'), -- {463}
('pm_protect_object','db_name name, object_kind name, object_name name'), -- {463}
('pm_revoke_from_policy','policy_name name, db_name name, object_kind name, object_name name, actions anyarray'), -- {463}
('pm_unprotect_object','db_name name, object_kind name, object_name name'), -- {463}
('point','path'), -- {463,550}
('reltime','interval'), -- {463}
('reltimeeq','reltime, reltime'), -- {463}
('reltimege','reltime, reltime'), -- {463}
('reltimegt','reltime, reltime'), -- {463}
('reltimein','cstring'), -- {463}
('reltimele','reltime, reltime'), -- {463}
('reltimelt','reltime, reltime'), -- {463}
('reltimene','reltime, reltime'), -- {463}
('reltimeout','reltime'), -- {463}
('reltimerecv','internal'), -- {463}
('reltimesend','reltime'), -- {463}
('set_bit','bytea, integer, integer'), -- {463}
('shell_out','opaque'), -- {463}
('shift_jis_2004_to_euc_jis_2004','integer, integer, cstring, internal, integer'), -- {463,550}
('shift_jis_2004_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('sjis_to_euc_jp','integer, integer, cstring, internal, integer'), -- {463,550}
('sjis_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('sjis_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('smgreq','smgr, smgr'), -- {463}
('smgrin','cstring'), -- {463}
('smgrne','smgr, smgr'), -- {463}
('smgrout','smgr'), -- {463}
('time','abstime'), -- {463}
('timemi','abstime, reltime'), -- {463}
('timenow',''), -- {463}
('timepl','abstime, reltime'), -- {463}
('timestamp','abstime'), -- {463}
('timestamp_izone_transform','internal'), -- {463}
('timestamp_transform','internal'), -- {463}
('timestamptz','abstime'), -- {463}
('timestamp_zone_transform','internal'), -- {463}
('time_transform','internal'), -- {463}
('tinterval','abstime, abstime'), -- {463}
('tintervalct','tinterval, tinterval'), -- {463}
('tintervalend','tinterval'), -- {463}
('tintervaleq','tinterval, tinterval'), -- {463}
('tintervalge','tinterval, tinterval'), -- {463}
('tintervalgt','tinterval, tinterval'), -- {463}
('tintervalin','cstring'), -- {463}
('tintervalle','tinterval, tinterval'), -- {463}
('tintervalleneq','tinterval, reltime'), -- {463}
('tintervallenge','tinterval, reltime'), -- {463}
('tintervallengt','tinterval, reltime'), -- {463}
('tintervallenle','tinterval, reltime'), -- {463}
('tintervallenlt','tinterval, reltime'), -- {463}
('tintervallenne','tinterval, reltime'), -- {463}
('tintervallt','tinterval, tinterval'), -- {463}
('tintervalne','tinterval, tinterval'), -- {463}
('tintervalout','tinterval'), -- {463}
('tintervalov','tinterval, tinterval'), -- {463}
('tintervalrecv','internal'), -- {463}
('tintervalrel','tinterval'), -- {463}
('tintervalsame','tinterval, tinterval'), -- {463}
('tintervalsend','tinterval'), -- {463}
('tintervalstart','tinterval'), -- {463}
('uhc_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_ascii','integer, integer, cstring, internal, integer'), -- {463}
('utf8_to_big5','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_euc_cn','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_euc_jis_2004','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_euc_jp','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_euc_kr','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_euc_tw','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_gb18030','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_gbk','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_iso8859','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_iso8859_1','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_johab','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_koi8r','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_koi8u','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_shift_jis_2004','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_sjis','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_uhc','integer, integer, cstring, internal, integer'), -- {463,550}
('utf8_to_win','integer, integer, cstring, internal, integer'), -- {463,550}
('varbit_transform','internal'), -- {463}
('varchar_transform','internal'), -- {463}
('width_bucket','anyelement, anyarray'), -- {463,550}
('win1250_to_latin2','integer, integer, cstring, internal, integer'), -- {463,550}
('win1250_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('win1251_to_iso','integer, integer, cstring, internal, integer'), -- {463,550}
('win1251_to_koi8r','integer, integer, cstring, internal, integer'), -- {463,550}
('win1251_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('win1251_to_win866','integer, integer, cstring, internal, integer'), -- {463,550}
('win866_to_iso','integer, integer, cstring, internal, integer'), -- {463,550}
('win866_to_koi8r','integer, integer, cstring, internal, integer'), -- {463,550}
('win866_to_mic','integer, integer, cstring, internal, integer'), -- {463,550}
('win866_to_win1251','integer, integer, cstring, internal, integer'), -- {463,550}
('win_to_utf8','integer, integer, cstring, internal, integer'), -- {463,550}
('xideqint4','xid, integer'),
('xidneqint4','xid, integer')
)
SELECT pc.* FROM pc JOIN depr using(proname)
WHERE
pc.proargs like depr.proargs||'%'
and ((pc.proowner != 'postgres'::regrole::text)
OR CARDINALITY(COALESCE(pc.proacl,'{}')) >0
OR CARDINALITY(pc.proacl)=0);
В случае обнаружения подобных функций необходимо их удалить.
Проверка наличия процедур, использующих устаревшую версию 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');
Если результат запроса не пустой, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03013:Прекращена поддержка языка Python 2.х. Список процедур, использующих их (<имя схемы>.<имя процедуры>): {list_of_procedures}. Удалите расширения на Python 2.х. и перепишите процедуры, использующие эту версию языка.__{{ control_name }}.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
, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03088:В кандидате на обновление обнаружены схемы с oid 2200 отличные от public в следующих базах данных: {list_of_databases}. Для продолжения обновления необходимо произвести переименование схем в public.__{{ control_name }}.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
.
Проверка наличия поддерживаемых операторов
- Автоматизированная проверка
- Ручная проверка
Осуществляется проверка наличия операторов, не поддерживаемых в новой версии Pangolin.
Если в ходе проверки будут обнаружены подобные операторы, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03094:Зафиксированы операторы, которые не поддерживаются в новой версии Pangolin. Список операторов: {list_of_operators}__{{ control_name }}.FAIL"
Где list_of_operators
- список операторов.
Необходимо выполнить проверку отсутствия в СУБД неподдерживаемых операторов.
Для этого необходимо подключиться к каждой БД и выполнить следующие SQL-запросы:
WITH depr(oprname,oprleft,oprright) AS (
VALUES
('#<','tinterval','reltime'),
('#<=','tinterval','reltime'),
('#<>','tinterval','reltime'),
('#=','tinterval','reltime'),
('#>','tinterval','reltime'),
('#>=','tinterval','reltime'),
('&&','tinterval','tinterval'),
('+','abstime','reltime'),
('-','abstime','reltime'),
('<','abstime','abstime'),
('<','reltime','reltime'),
('<','tinterval','tinterval'),
('<#>','abstime','abstime'),
('<<','tinterval','tinterval'),
('<=','abstime','abstime'),
('<=','reltime','reltime'),
('<=','tinterval','tinterval'),
('<>','abstime','abstime'),
('<>','reltime','reltime'),
('<>','tinterval','tinterval'),
('<?>','abstime','tinterval'),
('=','abstime','abstime'),
('=','reltime','reltime'),
('=','tinterval','tinterval'),
('>','abstime','abstime'),
('>','reltime','reltime'),
('>','tinterval','tinterval'),
('>=','abstime','abstime'),
('>=','reltime','reltime'),
('>=','tinterval','tinterval'),
('|','-','tinterval'),
('~=','tinterval','tinterval')
)
SELECT depr.* FROM depr JOIN pg_operator op ON
(depr.oprname,depr.oprleft::name,depr.oprright::name)=(op.oprname,op.oprleft::regtype::name,op.oprright::regtype::name)
AND op.oprowner <> 'postgres'::regrole;
WITH depr(opfname) AS (
VALUES
('abstime_minmax_ops'),
('abstime_ops'),
('abstime_ops'),
('reltime_minmax_ops'),
('reltime_ops'),
('reltime_ops'),
('tinterval_ops')
)
SELECT depr.* FROM depr JOIN pg_catalog.pg_opfamily opf using(opfname)
WHERE opf.opfowner <> 'postgres'::regrole;
Если по результатам выполнения данных запросов будут обнаружены неподдерживаемые операторы или неподдерживаемые семейства операторов, перед обновлением необходимо будет их удалить.
Проверка наличия не поддерживаемых полиморфных типов
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия не поддерживаемых полиморфных типов.
Если в ходе проверки будут обнаружены подобные полиморфные типы, то будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03096:Зафиксированы полиморфные типы, которые не поддерживаются в новой версии Pangolin. Список полиморфных типов: {list_of_polymorphic_types}__{{ control_name }}.FAIL"
Где list_of_polymorphic_types
- список полиморфных типов.
Необходимо убедиться в отсутствии более не поддерживаемых полиморфных типов.
Для этого необходимо подключиться к каждой БД и выполнить следующий запрос:
-- polymorthic
WITH depr(elem) AS (
VALUES
('array_append(anyarray,anyelement)'),
('array_cat(anyarray,anyarray)'),
('array_prepend(anyelement,anyarray)'),
('array_remove(anyarray,anyelement)'),
('array_replace(anyarray,anyelement,anyelement)'),
('array_position(anyarray,anyelement)'),
('array_position(anyarray,anyelement,integer)'),
('array_positions(anyarray,anyelement)'),
('width_bucket(anyelement,anyarray)')
)
SELECT
'aggregate (transform) ' objkind
, p.oid::regprocedure::text objname
FROM pg_proc AS p
JOIN pg_aggregate AS a ON a.aggfnoid=p.oid
JOIN pg_proc AS transfn ON transfn.oid=a.aggtransfn
JOIN depr ON a.aggtransfn=depr.elem::regprocedure
WHERE p.oid >= 16384
AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[])
UNION ALL
SELECT
'aggregate (final)' AS objkind
, p.oid::regprocedure::text AS objname
FROM pg_proc AS p
JOIN pg_aggregate AS a ON a.aggfnoid=p.oid
JOIN pg_proc AS finalfn ON finalfn.oid=a.aggfinalfn
JOIN depr ON a.aggtransfn=depr.elem::regprocedure
WHERE p.oid >= 16384
AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[])
UNION ALL
SELECT
'operator' AS objkind
,op.oid::regoperator::text AS objname
FROM pg_operator AS op
JOIN depr ON op.oprcode=depr.elem::regprocedure
WHERE op.oid >= 16384
AND oprleft = ANY(ARRAY['anyarray', 'anyelement']::regtype[]);
Если по итогу выполнения данного запроса будут обнаружены неподдерживаемые полиморфные типы, перед обновлением необходимо их удалить.
Проверка наличия полей в таблицах с типом xid
- Автоматизированная проверка
- Ручная проверка
Выполняется запрос к БД:
WITH RECURSIVE src AS (
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
WHERE
pa.atttypid::regtype::text IN ('xid','xid[]') AND
pa.attnum > 0 AND
pc.relkind != 'v'
UNION ALL
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
JOIN pg_catalog.pg_type pt ON pt.oid = pa.atttypid
JOIN src ON pt.typrelid = src.attrelid
WHERE
pa.attnum > 0 AND
pc.relkind != 'v'
)
SELECT format('%1$s(%2$s)',attrelid,attname) tbl_xid
FROM src
WHERE relnamespace::regnamespace::text !~ '^(information_schema|pg_)';
Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03073:Обнаружена(ы) таблица(ы) в которой(ых) присутствует(ют) поле(я) с типом xid. В новой версии СУБД Pangolin применяется 64-битный счетчик транзакций. Необходимо удалить поле(я) с типом xid в таблице(ах). Список таблиц, использующих их (<имя таблицы>(<имя колонки>)): {list_of_tables}__{{ control_name }}.FAIL"
Где list_of_tables
- список проблемных таблиц.
Необходимо проверить наличие полей в таблицах с типом xid
.
Для этого необходимо подключиться к БД и выполнить следующий SQL-запрос:
WITH RECURSIVE src AS (
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
WHERE
pa.atttypid::regtype::text IN ('xid','xid[]') AND
pa.attnum > 0 AND
pc.relkind != 'v'
UNION ALL
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
JOIN pg_catalog.pg_type pt ON pt.oid = pa.atttypid
JOIN src ON pt.typrelid = src.attrelid
WHERE pa.attnum > 0 AND pc.relkind != 'v')
SELECT format('%1$s(%2$s)',attrelid,attname) tbl_xid FROM src WHERE relnamespace::regnamespace::text !~ '^(information_schema|pg_)';
Если данный запрос выведет не пустой результат, то перед обновлением необходимо удалить данные поля, так как в новой версии СУБД применяется 64-битный счетчик транзакций.
Проверка с помощью утилиты pg_upgrade
- Автоматизированная проверка
- Ручная проверка
Проверка возможности обновления с помощью утилиты pg_upgrade check
.
Если проверка завершается с ошибкой, то выводится не блокирующая выполнение сценария ошибка.
При наличии в пользовательском файле конфигурации параметра is_print_pg_upgrade_logs
в значении true
ошибка выглядит следующим образом:
"{{ control_name }}.FAIL__E03016:Не прошла одна из проверок pg_upgrade. С ошибками можно ознакомиться на хосте master в директории {path_to_log} или в логе задачи (имя таски: journal pg_upgrade). Устраните возникшие ошибки в работе pg_upgrade.__{{ control_name }}.FAIL"
При отсутствии данного параметра, либо значении false
, ошибка будет выглядеть так:
"{{ control_name }}.FAIL__E03016:Не прошла одна из проверок pg_upgrade. С ошибками можно ознакомиться на хосте master в директории {path_to_log}. Устраните возникшие ошибки в работе pg_upgrade.__{{ control_name }}.FAIL"
Где path_to_log
- директория до лога работы утилиты pg_upgrade
.
При обработке ошибки необходимо перейти в лог выполнения задачи и поиском найти задачу journal pg_upgrade
. В задаче распечатаны все лог-файлы утилиты pg_upgrade
.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка с помощью утилиты pg_dumpall
- Автоматизированная проверка
- Ручная проверка
Проверка осуществляется с помощью утилиты pg_dumpall --schema-only --no-tablespaces --no-privileges
. Проверка заключается в снятии дампа схемы на текущей БД и загрузка схемы в экземпляр основанный на новой версии.
Во время выполнения могут быть выведены следующие ошибки:
-
Если снять дамп исходной СУБД не удалось, то выводится следующая блокирующая ошибка:
"{{ control_name }}.FAIL__E03074:Снять дамп с исходной СУБД не удалось. Возникли следующие ошибки: {error_stdout}.__{{ control_name }}.FAIL"
-
Если во время старта СУБД произошла неожиданная ошибка, то выводится блокирующая выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03030:Обнаружена ошибка во время старта СУБД для проверки загрузки схемы данных. Список ошибок: {error_stdout}.__{{ control_name }}.FAIL"
-
Если во время загрузки схемы данных происходит понятная ошибка, то выводится не блокирующая выполнение сценария ошибка:
"{{ control_name }}.FAIL__E03023:Найдены ошибки во время проверки загрузки схемы данных. Ссылка на схему данных в папке с логами: {inventory_hostname}: {path_to_log}/currentdb.sql. Список ошибок {error_stdout}. Если анализ выявил, что ошибка ложноположительная, добавьте ошибку в фильтр в переменную {false_error_filter_for_data_schema} кастомного конфигурационного файла.__{{ control_name }}.FAIL"
Где:
inventory_hostname
- наименование узла стенда;path_to_log
- путь до директории с логами;error_stdout
- оригинальный текст ошибки;false_error_filter_for_data_schema
- наименование переменной, в которую необходимо внести изменения.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка наличия логической репликации
- Автоматизированная проверка
- Ручная проверка
Происходит проверка наличия логической репликации в СУБД.
Если она будет найдена, то будет выведено сообщение:
"{{ control_name }}.FAIL__E03055:На стенде {inventory_hostname} обнаружено использование логической репликации. Удалите слот(ы): {name_of_slots}, для продолжения обновления. В настоящий момент обновление с наличием слотов логической репликации не подддерживается.__{{ control_name }}.FAIL"
Где:
inventory_hostname
- наименование узла стенда;name_of_slots
- имена слотов логической репликации.
Необходимо убедиться в отсутствии физических слотов логической репликации на стенде.
Для этого подключитесь к БД и выполните следующий SQL-запрос:
SELECT slot_name FROM pg_replication_slots WHERE slot_type = 'logical';
Если подобные слоты репликации будут обнаружены, перед обновлением необходимо будет их удалить.
Проверка наличия нестандартных прав или нестандартных владельцев для объектов
- Автоматизированная проверка
- Ручная проверка
Выполняется SQL-запрос к БД:
-- scout types/02 . Deprecated types
WITH RECURSIVE src AS (
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::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.sql_languages'), -- {463}
('information_schema.sql_packages'), -- {463}
('information_schema.sql_sizing_profiles'), -- {463}
('pg_catalog.abstime'), -- {463}
('pg_catalog._abstime'), -- {463}
('pg_catalog.opaque'), -- {463}
('pg_catalog.pg_pltemplate'), -- {463}
('pg_catalog.reltime'), -- {463}
('pg_catalog._reltime'), -- {463}
('pg_catalog.smgr'), -- {463}
('pg_catalog.tinterval'), -- {463}
('pg_catalog._tinterval') -- {463}
)
AND pa.attnum >0
UNION ALL
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::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_)';
Если запрос выведет не пустое значение, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03007:В кандидате на обновление обнаружены нестандартные права или нестандартный владелец для объектов: {list_of_objects}. Восстановите права доступа или владельца перечисленных объектов, так как в новой версии СУБД они отсутствуют.__{{ control_name }}.FAIL"
Где list_of_objects
- список объектов в БД с нестандартными правами/владельцем.
Необходимо проверить наличие нестандартных прав или нестандартных владельцев для объектов.
Для этого необходимо подключиться к БД и выполнить следующий SQL-запрос:
-- scout types/02 . Deprecated types
WITH RECURSIVE src AS (
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::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.sql_languages'), -- {463}
('information_schema.sql_packages'), -- {463}
('information_schema.sql_sizing_profiles'), -- {463}
('pg_catalog.abstime'), -- {463}
('pg_catalog._abstime'), -- {463}
('pg_catalog.opaque'), -- {463}
('pg_catalog.pg_pltemplate'), -- {463}
('pg_catalog.reltime'), -- {463}
('pg_catalog._reltime'), -- {463}
('pg_catalog.smgr'), -- {463}
('pg_catalog.tinterval'), -- {463}
('pg_catalog._tinterval') -- {463}
)
AND pa.attnum >0
UNION ALL
SELECT
pgc.relnamespace::regnamespace
,pa.attrelid::regclass
,pa.attname
,pa.atttypid::regtype
,pgc.relkind::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_)';
Если данный запрос выведет непустое значение, то необходимо выполнить восстановление прав или владельцев для полученных объектов, так как в новой версии СУБД они отсутствуют.
Проверка методов аутентификации в СУБД
- Автоматизированная проверка
- Ручная проверка
Производится проверка используемых методов аутентификации.
Если в СУБД используются методы аутентификации более не поддерживаемые версией Pangolin, на которую планируется обновление, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03008:При аутентификации в СУБД используются {list_of_methods} методы, которые перестанут работать после обновления СУБД, так как отсутствуют в enabled_extra_auth_methods = {enabled_extra_auth_methods}. Приведите все подключения к СУБД в соответствии с перечисленными в enabled_extra_auth_methods или добавьте {list_of_methods} в enabled_extra_auth_methods.__{{ control_name }}.FAIL"
Где:
list_of_methods
- список методов аутентификации, присутствующих в СУБД;enabled_extra_auth_methods
- список допустимых методов аутентификации.
Данная проверка предназначена исключительно для автоматизированных процессов и не реализуется при ручной проверке.
Проверка наличия неподдерживаемых параметров в конфигурационном файле Pangolin
- Автоматизированная проверка
- Ручная проверка
Скрипт-разведчик выполняет проверку неподдерживаемых параметров в конфигурационном файле postgresql.conf
. Если такие параметры найдены, выводится ошибка:
"{{ control_name }}.FAIL__E03070:В кандидате на обновление обнаружены неподдерживаемые параметры {list_of_deprecated_parameters} в конфигурационном файле {path_to_config} на хосте {inventory_hostname}. Для корректного обновления необходимо произвести удаление этих параметров.__{{ control_name }}.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
выставлено значение меньше минимально допустимого, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03009:Минимально допустимое значение для max_worker_processess должно быть >= {needed_value}. Допущена ошибка в конфигурировании max_worker_processess. Измените данный параметр в конфигурационном файле.__{{ control_name }}.FAIL"
Где inventory_hostname
- наименование узла стенда.
Где needed_value
- минимально допустимое значение для параметра max_worker_processess
.
Необходимо убедиться в корректности выставленного значения параметра max_worker_processes
в конфигурационном файле.
Значение данного параметра должно превышать сумму количества баз данных на узле (включая системные template1
, postgres
) + 6
. Например, если количество БД = 26, то значение параметра должно быть не меньше 32. Минимальным значением параметра max_worker_processes
является 8.
Проверка отсутствия ссылок при создании табличных пространств в БД
- Автоматизированная проверка
- Ручная проверка
Производится проверка использования ссылок для указания местоположения табличных пространств в БД.
Если подобные ссылки будут обнаружены, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03105:Обнаружено использование ссылки для указания местоположения табличного пространства в БД. Для работы скриптов обновления в базе данных необходимо указать реальные пути для всех табличных пространств. Список некорректных путей: {list_of_paths}__{{ control_name }}.FAIL"
Где list_of_paths
- список некорректных путей до табличных пространств.
Необходимо убедиться, что в указании путей до табличных пространств отсутствуют символические ссылки. Для этого необходимо выполнить следующую команду:
realpath <path_to_tablespace>
Где path_to_tablespace
- путь до табличного пространства, указанный в СУБД. Необходимо проверить путь до каждого табличного пространства, используемого в СУБД
Если в ходе проверки обнаружится использование ссылок, то перед проведением обновления необходимо указать реальные пути до табличных пространств.
Проверка наличия неподдерживаемых значений параметра clientcert в правилах pg_hba.conf
- Автоматизированная проверка
- Ручная проверка
Скрипт-разведчик выполняет поиск в файле pg_hba.conf
неподдерживаемые значения для параметра clientcert
.
Если подобные значения будут обнаружены, выводится ошибка:
"{{ control_name }}.FAIL__E03071:В кандидате на обновление обнаружены неподдерживаемые параметры {parameter_names} в правилах pg_hba на хосте {inventory_hostname}. Для корректного обновления необходимо произвести удаление этих параметров.__{{ control_name }}.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
.
Если данная команда выведет неподдерживаемые параметры, их необходимо удалить.
Проверки для обновления исполняемых файлов
При данном типе обновления выполняются все проверки из блока «Проверки для всех типов обновлению», а также проверки перечисленные далее в данном блоке.
Проверка с помощью утилиты pg_inplace_upgrade
- Автоматизированная проверка
- Ручная проверка
Выполняется проверка с помощью утилиты pg_inplace_upgrade
.
Если в ходе проверки возможности обновления возникли ошибки, то будет выведено следующее сообщение:
"{{ control_name }}.FAIL__E03097:В процессе проверки наличия изменений в системном каталоге возникли ошибки: {error_stdout}. Запуск обновления невозможен. Перед повторным запуском сценария необходимо изучить список полученных ошибок, причиной может стать некорректная версия каталога или отсутствие прав на рабочие файлы утилиты в каталоге {path_to_catalog}.__{{ control_name }}.FAIL"
Где:
error_stdout
- оригинальный текст ошибки утилитыpg_inplace_upgrade
;path_to_catalog
- путь до каталога с рабочими файлами утилитыpg_inplace_upgrade
.
Необходимо убедиться, что сценарий обновления исполняемых файлов подходит для стенда. Запустите команду из примера ниже на мастере и на реплике:
sudo mkdir -p /home/postgres/pg_inplace_upgrade/{util,backup,log,dump}
sudo cp -r ~/pangolin/installer/utilities/pg_inplace_upgrade/* /home/postgres/pg_inplace_upgrade/util
sudo chmod 700 -R /home/postgres/pg_inplace_upgrade
sudo chown postgres:postgres -R /home/postgres/pg_inplace_upgrade
sudo -iu postgres
export PANGOLIN_VER=x.x.x
export PANGOLIN_OLD_VER=x.x.x
export PGPASSWORD=<password for db user>
cd /home/postgres/pg_inplace_upgrade/util
./inplace_upgrade.sh info -n $PANGOLIN_OLD_VER -N $PANGOLIN_VER -s /home/postgres/pg_inplace_upgrade/util -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/6.4.0/
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.
===================================================
Проверка наличия физических слотов репликации
- Автоматизированная проверка
- Ручная проверка
Производится проверка наличия физических слотов репликации.
Если будет обнаружен физический слот репликации, который зарезервирован для использования утилитой pg_inplace_upgrade
, будет выведена следующая ошибка:
"{{ control_name }}.FAIL__E03102:На стенде {inventory_hostname} обнаружено использование физической репликации {name_tmp_slot}, которая нужна для корректного выполнения обновления. Для продолжения обновления требуется удалить данный слот.__{{ control_name }}.FAIL"
Где:
inventory_hostname
- наименование узла стенда;name_tmp_slot
- наименование физического слота репликации.
Необходимо убедиться, что зарезервированный для обновления физический слот репликации отсутствует в СУБД.
Для этого подключитесь к БД и выполните следующий SQL-запрос:
SELECT count(*) FROM pg_replication_slots WHERE slot_name = tmp_update_slot;
Если данный физический слот репликации существует, то необходимо удалить данный слот.
Вывод информационных сообщений процесса разведки
Раздел описывает возможные информационные сообщения скрипта-разведчика в случае автоматизированной проверки. При реализации ручного варианта проверки — пропустите данный раздел.
Вывод информационного сообщения для типа обновления с переносом данных
Если обновление будет производиться с переносом данных, то выводится информационное сообщение:
"{{ control_name }}.INFO__I03001:Для миграции данных используется специальная утилита pg_upgrade. Во время миграции данные в новую версию базы данных будут перенесены в режиме копирования данных, что приведет к дополнительному увеличению времени обновления СУБД.__{{ control_name }}.INFO"
Вывод информационного сообщения о недоступности СУБД
Перед завершением работы скрипта-разведчика будет выведено следующее информационное сообщение:
"{{ control_name }}.INFO__I03002:На время обновления база данных будет недоступна. Обратите внимание при планировании работ.__{{ control_name }}.INFO"
Удаление каталога для временных файлов
Производится удаление каталога для временных файлов:
{{ local_backup_path }}/scout_temp_data
Вывод информационного сообщения estimation_update_execution_time
При успешном прохождении выше описанных проверок и наличия не пустого значения параметра estimation_update_execution_time
в настраиваемом конфигурационном файле выводится информационное сообщение:
"{{ control_name }}.INFO__
Оценка времени выполнения обновления СУБД Pangolin по результатам НТ:
а) Standalone конфигурация:
- 54 минуты (100 Gb СУБД Pangolin)
- 126 минут (500 Gb СУБД Pangolin)
- 309 минут (800 Gb СУБД Pangolin)
б) Cluster конфигурация:
- 90 минут (100 Gb СУБД Pangolin)
- 359 минут (500 Gb СУБД Pangolin)
- 599 минут (800 Gb СУБД Pangolin)
Характеристики серверов:
a) Standalone, Active, Standby:
- ОС Red Hat Enterprise Linux Server;
- CPU 16 ядер (Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz);
- RAM 128 Gb;
- Disk HDD 2000 Gb;
- Пропускная способность сети 10Gbit/s.
б) Arbiter:
- ОС Red Hat Enterprise Linux Server;
- CPU 2 ядра (Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz);
- RAM 2 Gb;
- Disk HDD 50 Gb;
- Пропускная способность сети 10Gbit/s.
Сценарий нагрузочного тестирования:
1) Обновление с версии pangolin 4.3.0 до версии pangolin 5.2.0 при нагруСУБД pangolin 100 tps
2) Конфигурация серверов:
- cluster (cluster-patroni-etcd-pgbouncer); \
- standalone (standalone-postgresql-pgbouncer).
3) Размер СУБД pangolin:
- 100 GB;
- 500 GB;
- 800 GB;
4) Процент объема индексов в СУБД pangolin: 30-40%
__{{ control_name }}.INFO"
Обработка неизвестной ошибки
В случае появления неожиданной ошибки, будет выведена блокирующая выполнение сценария ошибка:
"{{ control_name }}.FAIL__E01008:В процессе работы скрипта произошла неожиданная ошибка: {}. Ознакомьтесь с логами.__{{ control_name }}.FAIL"
Вывод информационного сообщения с набором действий, которые необходимо произвести после завершения процесса обновления СУБД
По завершению процесса обновления СУБД Pangolin будет выведено информационное сообщение с необходимым набором дальнейших действий. Пример сообщения:
"{{ control_name }}.WARNING__W03005:Набор действий, необходимых произвести ПОСЛЕ завершения текущего процесса обновления СУБД:
1) необходимо учесть, что файл recovery.conf более не исплогике работы СУБД (для кластерной конфигурации)
2) необходимо учесть, что была расширена информация осертификатах ssl в представлении pg_stat_ssl и колонка clientdn была переименована в client_dn
3) необходимо учесть, что были изменены параметры хранениWAL-файлов, параметр wal_keep_segments был объявлен устаревшим, поэтому необходимо перейти на использованиwal_keep_size
4) обращаем внимание, что начиная с версии СУБД Panвведено понятие TRUSTED EXTENSIONS, таким образом определенные расширения (список таких расширений можно получить с помоSELECT DISTINCT name FROM pg_available_extension_versions WHERE TRUSTED ORDER BY name;) в дальнейшем могут бпользователями с правами CREATE (пользователи входящиегруппу) на уровне базы данных
5) необходимо учесть, что в новой версии СУБД Pangolinизменены некоторые вендорские процедуры, а именно мог измениться состав или порядок аргументов для них (напримsec_admin, в которых убран аргумент current_database).
Рекомендация: перед началом обновления версии СУБД внимательно изучить release notes новой версии.__{{ control_name }}.WARNING"
Вывод информационного сообщения об успешном завершении сценария проверки
При успешном прохождении выше описанных проверок будет выведено следующее сообщение:
"{{ control_name }}.OK__S03001:Разведка перед обновлением успешно выполнена.__{{ control_name }}.OK"
Если проверка прошла успешно, то необходимо переходить к процессу обновления.