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

Ручное обновление СУБД Pangolin

Сведения

При переходе к данному разделу предполагается, что изучена информация общего блока «Обновление».

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

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

mkdir ~/pangolin/cache/
echo " <заменить на содержимое скрипта pangolin_checks.sh> " > ~/pangolin/cache/pangolin_checks.sh
chmod 0700 ~/pangolin/cache/pangolin_checks.sh
cd ~/ && sudo STAND=master CONFIGURATION=standalone ./pangolin/cache/pangolin_checks.sh
pangolin-check.sh

pangolin-check.sh:

function log_form {
echo -e "\e[32m===============================[0m"
echo -e "\e[32mКонфигурация: $CONFIGURATION[0m"
echo -e "\e[32mСтенд: $STAND[0m"
echo -e "\e[32m===============================[0m"
}

function error_message {
echo -e "\e[31mERROR: Проверка не пройдена. $1\e[0m"
}

function success_message {
echo -e "\e[32mOK: Проверка пройдена. $1\e[0m"
}

function warning_message {
echo -e "\e[33mWARNING: $1\e[0m"
}

log_form

if [ -z "$STAND" ] || [ -z "$CONFIGURATION" ]; then
echo -e "\e[31mERROR: Передайте обязательные переменные перед запуском скрипта для корректной проверки. Например: STAND=master CONFIGURATION=standalone ./pangolin_checks.sh.\e[0m"
exit 1
fi

# Проверка наличия локали en_us.utf-8 или en_us.utf8
if locale -a | grep -qE "en_US.utf-8|en_US.utf8"; then
success_message "Локаль en_US.utf-8 или en_US.utf8 установлена."
else
error_message "Необходимо установить локаль en_US.utf-8 или en_US.utf8."
fi

# Определение списка рабочих файлов в зависимости от конфигурации и стенда
file_common=("/etc/pgbouncer/pgbouncer.ini" "/etc/systemd/system/pgbouncer.service" "/usr/local/bin/pgbouncer" "/opt/pangolin-common/bin/pg_auth_reencrypt" "/etc/systemd/system/pangolin_reencrypt@.service" "/etc/postgres/enc_util.cfg" "/opt/ pangolin-common/bin/pg_certs_rotate_agent" "/etc/systemd/system/pg_certs_rotate_agent.service" "/etc/postgres/pg_certs_rotate_agent.yml")
if [ "$CONFIGURATION" = "cluster" ]; then
if [ "$STAND" != "arbiter" ]; then
additional_files=("/etc/systemd/system/patroni.service" "/etc/patroni/postgres.yml" "/etc/systemd/system/etcd.service" "/etc/etcd/etcd.conf")
else
additional_files=("/etc/systemd/system/etcd.service" "/etc/etcd/etcd.conf")
fi
else
if [ "$STAND" != "arbiter" ]; then
additional_files=("/etc/systemd/system/postgresql.service")
fi
fi
if [ "$STAND" != "arbiter" ]; then
files_all=("${file_common[@]}" "${additional_files[@]}")
else
files_all=("${additional_files[@]}")
fi

# Проверка наличия рабочих файлов
for file in "${files_all[@]}"; do
if [ -f "$file" ]; then
success_message "Рабочий файл $file найден."
else
error_message "Рабочий файл $file не найден. Для конфигурации $CONFIGURATION наличие данного файла необходимо для корректного обновления."
fi
done

# Определение списка сервисов в зависимости от конфигурации
service_common=("pgbouncer" "pg_certs_rotate_agent" "pangolin_reencrypt@postgres.service" "pangolin_reencrypt@kmadmin_pg.service")
if [ "$CONFIGURATION" = "cluster" ]; then
if [ "$STAND" != "arbiter" ]; then
additional_services=("patroni" "etcd")
else
additional_services=("etcd")
fi
else
if [ "$STAND" != "arbiter" ]; then
additional_services=("postgresql")
fi
fi
if [ "$STAND" != "arbiter" ]; then
service_all=("${service_common[@]}" "${additional_services[@]}")
else
service_all=("${additional_services[@]}")
fi

# Проверка состояния сервисов
for service in "${service_all[@]}"; do
if systemctl is-active --quiet "$service"; then
success_message "Сервис $service активен."
else
error_message "Необходимо запустить сервис $service."
fi
done

if [ "$STAND" != "arbiter" ]; then
# Проверка наличия установленного rpm пакета
PACKAGE_NAME="platform-v-pangolin-dbms"
if command -v yum &> /dev/null; then
PACKAGE_MANAGER="yum"
elif command -v dnf &> /dev/null; then
PACKAGE_MANAGER="dnf"
elif command -v apt &> /dev/null; then
PACKAGE_MANAGER="apt"
elif command -v apt-get &> /dev/null; then
PACKAGE_MANAGER="apt-get"
else
error_message "Необходимо установить пакетный менеджер (yum/dnf/apt/apt-get)."
exit 1
fi

if $PACKAGE_MANAGER list installed | grep -q "$PACKAGE_NAME"; then
success_message "Пакет $PACKAGE_NAME установлен."
else
error_message "Пакет $PACKAGE_NAME не обнаружен на стенде."
fi

# Получение версии пакета
PACKAGE_VERSION=$($PACKAGE_MANAGER list installed | grep "$PACKAGE_NAME" | awk '{print $2}')

# Извлечение числовой части версии
NUMERIC_VERSION=$(echo "$PACKAGE_VERSION" | awk -F'[.-]' '{print $1 $2 $3}' | tr -d '0')

# Проверка версии пакета
if [[ $NUMERIC_VERSION =~ ^55[0-9]$ ]]; then
success_message "Версия исходного пакета $PACKAGE_NAME ($NUMERIC_VERSION) соответствует требованиям инструкции по ручному обновлению с переносом данных."
else
error_message "Инструкция по ручному обновлению не рассматривает обновление с исходной версии пакета $PACKAGE_NAME ($NUMERIC_VERSION), полученной со стенда. Инструкция рассматривает обновление с версий 5.5.x на 6.4.х."
fi
fi

warning_message "Набор проверок не является исчерпывающим. Для обновления рекомендуем использовать автоматизированные скрипты."

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

Проверка пройдена успешно

Результат при неготовности стенда к обновлению:

Проверка не пройдена

Предупреждение!

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

Сценарии обновления

Внимание!

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

Обновление компонентов

Обновление компонентов СУБД Pangolin описывается в каждом описанном сценарии обновления.

Проверка результатов обновления

Для проверки успешности обновления СУБД рекомендуется использовать чек-лист проверки корректности работы СУБД Pangolin.

Восстановление продукта после неудачного обновления