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

Ручное обновление с переносом данных СУБД Pangolin

Данный раздел рассматривает ручное обновление с переносом данных СУБД Pangolin с версии 6.5.2 до 7.1.0.

Внимание!

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

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

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

Все команды ниже являются примерами. Их необходимо отредактировать в соответствии с требуемыми параметрами и конфигурациями. В названиях rpm-пакетов, при необходимости, в блоках кода замените наименование ОС и пакетного менеджера. Также, в данной инструкции, распакованный дистрибутив находится в каталоге под названием pangolin.

Важно

Для предотвращения полной переливки данных на резервный узел кластера Pangolin и возможного нарушения доступности сервиса при переходе с версии Pangolin 6.5.2 на версию 7.1.0 настоятельно рекомендуется заблаговременно произвести операцию VACUUM FREEZE во всех базах данных. Обратите внимание на пункт «Запуск процесса заморозки» в блоке проверки готовности к обновлению.

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

Обозначения переменных

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

  • PANGOLIN_VER - новая версия СУБД Pangolin (формат - x.x.x/x.x);
  • PANGOLIN_MAJOR_VER - номер новой мажорной версии (формат - 0x)
  • PANGOLIN_MAJOR_OLD_VER - номер старой мажорной версии (формат - 0x)
  • PANGOLIN_BACKUP_TOOLS - новая версия компонента pangolin-backup-tools (формат - x.x.x);
  • PANGOLIN_POOLER - новая версия компонента pangolin-pooler (формат - x.x.x);
  • PANGOLIN_MANGER - новая версия компонента pangolin-manager (формат - x.x.x);
  • PANGOLIN_TIMESCALEDB - новая версия компонента pangolin-timescaledb (формат - x.x.x);
  • PANGOLIN_OLD_VER - исходная версия СУБД Pangolin (формат - x.x.x/x.x);
  • PANGOLIN_FULL_VER - новая версия СУБД Pangolin (формат - 0x.00x.0x);
  • PANGOLIN_FULL_OLD_VER - исходная версия СУБД Pangolin (формат - 0x.00x.0x).

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

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

Параметры стенда, затрагиваемые обновлением

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

  • удаление;
  • изменение;
  • добавлены при отсутствии на стенде.

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

  • postgresql.conf (для standalone конфигурации): добавление новых параметров из новой версии, замена старых значений в соответствии с правилом замены параметров;
  • postgres.yml (для конфигурации cluster): добавление новых параметров из новой версии, замена старых значений в соответствии с правилом замены параметров;
  • pangolin-pooler.ini: добавление новых параметров из новой версии, замена старых значений в соответствии с правилом замены параметров;
  • postgresql.auto.conf: добавление новых параметров из новой версии без замены старых значений;
  • postgresql.base.conf: добавление новых параметров из новой версии без замены старых значений;
  • pg_hba.conf: добавление новых параметров из новой версии без замены старых значений, кроме параметров типа pghba_users (берутся из новой версии с заменой старых значений).

Правила замены параметров в файлах

Значение переменных

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

  • {{ PGHOME }} — путь до каталога PGHOME серверной части;
  • {{ PGHOME_CLIENT }} — путь до каталога клиентской части PGHOME_CLIENT;
  • {{ PGDATA }} — путь до директории данных PGDATA;
  • {{ PGBACKUP }} — путь до каталога для создания РК PGBACKUP;
  • {{ PGBACKUP_BIN }} — путь до pangolin_backup_files.bin_path (по умолчанию /opt/pangolin-backup-tools/bin);
  • {{ CLUSTER_NAME }} — имя кластера;
  • {{ POOLER_BIN }} — путь до каталога pangolin_pooler_files.bin_dir (по умолчанию /opt/pangolin-pooler/bin);
  • {{ USED_FQDN_HOST }} — адрес из переменной used_fqdn_host, если доступен;
  • {{ ANSIBLE_FQDN }} — адрес ansible_fqdn, если used_fqdn_host недоступен;
  • {{ PORTS_PG }} — значение переменной ports.pg;
  • {{ PORTS_PGBOUNCER_PG_AUTH }} — значение порта pgbouncer_pg_auth.
Параметры с зависимостью от ядер CPU

Значение параметровmax_parallel_workers и max_worker_processes автоматически рассчитывается исходя из количества ядер CPU сервера, однако максимальное значение ограничено 32 рабочими потоками.

Формула расчета:

Максимальное количество параллельных процессов определяется следующим образом:

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

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

  • postgres.yml:

    postgresql:
    bin_dir: {{ PGHOME }}/bin
    bin_dir_client: {{ PGHOME_CLIENT }}/bin
    parameters:
    pg_plugins_path: {{ PGHOME }}/lib
    archive_command: {{ PGBACKUP_BIN }}/pg_probackup archive-push -B {{ PGBACKUP }} —instance {{ CLUSTER_NAME }} —wal-file-path=%p —wal-file-name=%f —compress —overwrite -j 4 —batch-size=100
    superuser_reserved_connections: 10 # Значение по умолчанию
    max_parallel_workers: {{ CPU <= x >= CPU_min & x <=32 }}
    max_worker_processes: {{ CPU <= x >= CPU_min & x <=32 }}
    enabled_extra_auth_methods: 'cert' # Значение по умолчанию
    wal_keep_size: {{WAL_KEEP_SEGMENT_VALUE}}
    callbacks:
    on_role_change: {{ POOLER_BIN }}/pangolin-pooler-restart.sh
    log:
    file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log
    bootstrap.dcs.postgresql.parameters:
    max_worker_processes: {{ CPU <= x >= CPU_min & x <=32 }}
    ПараметрНовое значение / ФорматС чем связано обновление параметра
    bin_dir{{ PGHOME }}/binИзменен путь к серверной части (PGHOME)
    bin_dir_client{{ PGHOME_CLIENT }}/binРазделение клиентской и серверной части
    pg_plugins_path{{ PGHOME }}/libРазделение клиентской и серверной части и изменение пути до PGHOME
    archive_command{{ PGBACKUP_BIN }}/pg_probackup archive-push -B {{ PGBACKUP }} —instance {{ CLUSTER_NAME }} —wal-file-path=%p —wal-file-name=%f —compress —overwrite -j 4 —batch-size=100Возможны изменения путей по умолчанию в переменных команды
    superuser_reserved_connections10Изменены минимальные системные требования
    max_parallel_workers{{ CPU <= x >= CPU_min & x <=32 }}Изменены минимальные системные требования
    max_worker_processes{{ CPU <= x >= CPU_min & x <=32 }}Только для standalone-конфигураций. Изменены минимальные системные требования
    enabled_extra_auth_methodscertТолько при обновлении с переносом данных. Изменены требования по безопасности
    wal_keep_size{{WAL_KEEP_SEGMENT_VALUE}}Добавление/изменение параметра в связи с переходом от определения wal_keep_segments к wal_keep_size
    on_role_change{{ POOLER_BIN }}/pangolin-pooler-restart.shИзменение пути до каталога pangolin_pooler_files.bin_dir({{ POOLER_BIN }})
    log.file_namepangolin-manager-%Y-%m-%d_%H%M%S.logИзменено имя лог-файла
    bootstrap.dcs.postgresql.parameters.max_worker_processes{{ CPU <= x >= CPU_min & x <=32 }}Изменены минимальные системные требования
  • postgresql.conf:

    hba_file: {{ PGDATA }}/pg_hba.conf
    ident_file: < путь до папки 'PGDATA' >/pg_ident.conf
    pg_plugins_path: {{ PGHOME }}/lib
    archive_command: {{ PGBACKUP_BIN }}/pg_probackup archive-push -B {{ PGBACKUP }} —instance {{ CLUSTER_NAME }} —wal-file-path=%p —wal-file-name=%f —compress —overwrite -j 4 —batch-size=100
    superuser_reserved_connections: 10 # Значение по умолчанию
    max_parallel_workers: {{ CPU <= x >= CPU_min & x <=32 }}
    max_worker_processes: {{ CPU <= x >= CPU_min & x <=32 }}
    enabled_extra_auth_methods: 'cert' # Значение по умолчанию
    wal_keep_size: {{WAL_KEEP_SEGMENT_VALUE}}
    ПараметрНовое значение / ФорматС чем связано обновление параметра
    hba_file{{ PGDATA }}/pg_hba.confИзменен путь до PGDATA
    ident_file{{ PGDATA }}/pg_ident.confТолько при обновлении с переносом данных. Изменен путь до PGDATA
    pg_plugins_path{{ PGHOME }}/libИзменен путь до PGHOME в новой версии
    archive_command{{ PGBACKUP_BIN }}/pg_probackup archive-push -B {{ PGBACKUP }} —instance {{ CLUSTER_NAME }} —wal-file-path=%p —wal-file-name=%f —compress —overwrite -j 4 —batch-size=100Возможны изменения путей по умолчанию в переменных команды
    superuser_reserved_connections10Изменены минимальные системные требования
    max_parallel_workers{{ CPU <= x >= CPU_min & x <=32 }}Изменены минимальные системные требования
    max_worker_processes{{ CPU <= x >= CPU_min & x <=32 }}Только для standalone-конфигураций. Изменены минимальные системные требования
    enabled_extra_auth_methodscertТолько при обновлении с переносом данных. Изменены требования по безопасности
    wal_keep_size{{WAL_KEEP_SEGMENT_VALUE}}Добавление/изменение параметра в связи с переходом от определения wal_keep_segments к wal_keep_size
  • pangolin-poller.ini:

    databases:
    * = host={{ USED_FQDN_HOST or ANSIBLE_FQDN }} port={{ PORTS_PG }} auth_port={{ PORTS_PGBOUNCER_PG_AUTH }} auth_pool_size=1
    pgbouncer:
    admin_users: pgbouncer
    ПараметрНовое значение / ФорматС чем связано обновление параметра
    databases* = host={{ USED_FQDN_HOST or ANSIBLE_FQDN }} port={{ PORTS_PG }} auth_port={{ PORTS_PGBOUNCER_PG_AUTH }} auth_pool_size=1Обновление параметра связано с возможным изменением параметра ports.pg
    pgbouncer.admin_userspgbouncerДобавление нового параметра при возможном отсутствии

Удаляемые параметры в файлах:

  • postgres.yml:

    postgresql:
    authentication:
    replication.password: * # Для конфигураций с включенным 'auth_reencrypt', удаление параметра в связи с требованиями по безопасности подключения
    superuser.password: * # Для конфигураций с включенным 'auth_reencrypt', удаление параметра в связи с требованиями по безопасности подключения
    parameters:
    wal_keep_segments: * # Удаление параметра ввиду перехода от определения 'wal_keep_segments' к 'wal_keep_size'
  • pangolin-poller.ini:

    auth_user: *                      # Удаление параметра в связи с требованиями по безопасности подключения
    auth_query: * # Удаление параметра в связи с требованиями по безопасности подключения

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

Сведения

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

Перед обновлением необходимо произвести проверку готовности СУБД и устранить выявленные проблемы. Список необходимых проверок представлен в разделе «Проверка готовности к обновлению».

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

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

  2. Ознакомьтесь с особенностями обновления, связанные с переходом на ядро PostgreSQL 17.5.

  3. Проверьте наличие расширений, установленных в схему public или в системный каталог (рекомендуется: перенести в схему ext).

  4. В случае кластерной конфигурации, обновите строку подключения к СУБД (проверьте значение портов) и убедитесь, что в строке указаны оба узла кластера (active и standby) так как в процессе обновления утилита confd будет автоматически удалена. Пример исправления неактуальной строки для подключения:

    Строку:

    jdbc:postgresql://127.0.0.1:6544,127.0.0.2:6544/dbname?prepareThreshold=0`

    Исправьте на:

    jdbc:postgresql://127.0.0.1:6544,127.0.0.2:6544/dbname?targetServerType=master&prepareThreshold=0
  5. В случае использования расширения timescaledb убедитесь, что обновляемая версия расширения не ниже 2.19.3. В противном случае необходимо сначала обновить расширение до этой версии. Если поднять версию расширения в рамках одной версии СУБД невозможно, следует произвести обновление СУБД на промежуточную, а затем на целевую версию. Уточнение по процессу обновления стендов с предустановленным расширением timescaledb указано в «Таблице поддерживаемых для обновления версий СУБД».

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

Шаг 1. Резервное копирование рабочих файлов компонентов

  1. (master, replica) Сохраните рабочие файлы компонентов СУБД Pangolin:

    • general:

      # дополнительно создать на узле arbiter
      mkdir -p ~/pangolin/cache/backup/general
      # дополнительно сохранить на узле arbiter
      sudo cp -ra /usr/local/sbin/dynmotd.sh ~/pangolin/cache/backup/general/
      sudo cp -ra /home/postgres/.bash_profile ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/sudoers.d/10-kmadmin_pg ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/sudoers.d/10-postgres ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/pangolin-security-utilities/enc_connection_settings_cert.cfg ~/pangolin/cache/backup/general/
    • Pangolin Pooler:

      mkdir -p ~/pangolin/cache/backup/pooler
      sudo cp -ra /usr/lib/systemd/system/pangolin-pooler.service ~/pangolin/cache/backup/pooler/
      sudo cp -ra /etc/pangolin-pooler/pangolin-pooler.ini ~/pangolin/cache/backup/pooler/
      sudo cp -ra /etc/pangolin-pooler/userlist.txt ~/pangolin/cache/backup/pooler/
      sudo cp -ra /opt/pangolin-pooler/bin/pangolin-pooler ~/pangolin/cache/backup/pooler/
      sudo cp -ra /opt/pangolin-pooler/share/man/man1/pangolin-pooler.1 ~/pangolin/cache/backup/pooler/
      sudo cp -ra /opt/pangolin-pooler/share/man/man5/pangolin-pooler.5 ~/pangolin/cache/backup/pooler/
    • Pangolin Manager:

      mkdir -p ~/pangolin/cache/backup/manager
      sudo cp -ra /usr/lib/systemd/system/pangolin-manager.service ~/pangolin/cache/backup/manager/
      sudo cp -ra /etc/pangolin-manager/postgres.yml ~/pangolin/cache/backup/manager/
      sudo cp -ra /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh ~/pangolin/cache/backup/manager/
      sudo cp -ra /opt/pangolin-manager/bin/pangolin-manager ~/pangolin/cache/backup/manager/
      sudo cp -ra /pgdata/06/data/patroni.dynamic.json ~/pangolin/cache/backup/manager/
    • pangolin-auth-reencrypt:

      mkdir -p ~/pangolin/cache/backup/pangolin_auth_reencrypt
      sudo cp -ra /etc/systemd/system/multi-user.target.wants/pangolin-auth-reencrypt@kmadmin_pg.service ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/systemd/system/multi-user.target.wants/pangolin-auth-reencrypt@postgres.service ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/pangolin-auth-reencrypt/enc_util.cfg ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/pangolin-auth-reencrypt/kmadmin_pg ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/pangolin-auth-reencrypt/postgres ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/pangolin-auth-reencrypt/kmadmin_pg/enc_params.cfg.kmadmin_pg ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/pangolin-auth-reencrypt/postgres/enc_params.cfg.postgres ~/pangolin/cache/backup/pangolin_auth_reencrypt/
    • pangolin-certs-rotate:

      mkdir -p ~/pangolin/cache/backup/pangolin-certs-rotate
      sudo cp -ra /usr/lib/systemd/system/pangolin-certs-rotate.service ~/pangolin/cache/backup/pangolin-certs-rotate/
      sudo cp -ra /opt/pangolin-certs-rotate/bin/pangolin-certs-rotate ~/pangolin/cache/backup/pangolin-certs-rotate/
      sudo cp -ra /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml ~/pangolin/cache/backup/pangolin-certs-rotate/
    • pangolin_dbms:

      export PANGOLIN_OLD_VER=6.x
      export PANGOLIN_MAJOR_OLD_VER=06
      mkdir -p ~/pangolin/cache/backup/pangolin_dbms
      mkdir -p ~/pangolin/cache/backup/rpms
      sudo dnf download --destdir=/home/<user>/pangolin/cache/backup/pangolin_dbms/ pangolin-dbms-$PANGOLIN_OLD_VER
      sudo cp -ra /usr/pangolin-$PANGOLIN_OLD_VER/ ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/$PANGOLIN_MAJOR_OLD_VER/data/postgresql.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/$PANGOLIN_MAJOR_OLD_VER/data/pg_hba.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/$PANGOLIN_MAJOR_OLD_VER/data/postgresql.base.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/$PANGOLIN_MAJOR_OLD_VER/data/postgresql.auto.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/$PANGOLIN_MAJOR_OLD_VER/data/pg_quota.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/$PANGOLIN_MAJOR_OLD_VER/data/pg_ident.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /usr/pangolin-$PANGOLIN_OLD_VER/share/postgresql.service ~/pangolin/cache/backup/pangolin_dbms/
    • Остальные пакеты

       export PANGOLIN_OLD_VER=6.x
    mkdir -p ~/pangolin/cache/backup/rpms
    sudo dnf download --destdir=/home/<user>/pangolin/cache/backup/rpms/ pangolin-dbms-$PANGOLIN_OLD_VER-client pangolin-auth-reencrypt pangolin-backup-tools pangolin-backup-tools-venv pangolin-certs-rotate pangolin-diagnostic-tool pangolin-manager pangolin-manager-venv pangolin-pooler pangolin-security-utilities pangolin-timescaledb-$PANGOLIN_OLD_VER-apache
  2. (master) Создайте каталог для резервной копии:

    sudo mkdir -p /pgarclogs/cache/backup/pangolin_dbms /pgarclogs/cache/backup/pangolin_dbms{backups,wal}
    sudo chmod -R 0700 /pgarclogs/cache/backup/pangolin_dbms
    sudo chown -R postgres:postgres /pgarclogs/cache/
  3. (master) Добавьте запись host replication postgres 127.0.0.1/32 scram-sha-256 первой строкой в файл /pgdata/0<major_ver>/data/pg_hba.conf или в файл /etc/pangolin-manager/postgres.yml в секцию pg_hba для конфигурации с Pangolin Manager.

  4. (master) Перечитайте обновленный конфигурационный файл БД.

    • Для конфигурации без Pangolin Manager:

      sudo su - postgres
      export PANGOLIN_MAJOR_OLD_VER=06
      /usr/pangolin/bin/pg_ctl reload -D /pgdata/$PANGOLIN_MAJOR_OLD_VER/data
    • Для конфигурации с Pangolin Manager:

      sudo iu - postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
    Ошибка «This system supports the C.UTF-8 locale which is recommended»

    Если при вызове утилиты возникает ошибка в локалях кодировки: This system supports the C.UTF-8 locale which is recommended, то выполните следующую команду:

    echo "
    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8" >> .bash_profile &&\
    source .bash_profile
  5. (master) Выполните резервное копирование:

    export PANGOLIN_MAJOR_OLD_VER=06
    export PGPASSWORD=<password_postgres>
    sudo -iu postgres /opt/pangolin-backup-tools/bin/pg_probackup init -B /pgarclogs/cache/backup/pangolin_dbms
    sudo -iu postgres /opt/pangolin-backup-tools/bin/pg_probackup add-instance -B /pgarclogs/cache/backup/pangolin_dbms -D /pgdata/$PANGOLIN_MAJOR_OLD_VER/data --instance clustername
    sudo -iu postgres PGPASSWORD=$PGPASSWORD /opt/pangolin-backup-tools/bin/pg_probackup backup -B /pgarclogs/cache/backup/pangolin_dbms --instance clustername -b FULL -h 127.0.0.1 -p 5433 -U postgres --compress-algorithm=zlib --compress-level=4 -j 14 --temp-slot --stream --progress -w
  6. (master) Удалите строку host replication postgres 127.0.0.1/32 scram-sha-256 из файла /pgdata/0<major_ver>/data/pg_hba.conf или из файла /etc/pangolin-manager/postgres.yml для конфигурации с Pangolin Manager.

  7. (master) Перечитайте обновленный конфигурационный файл БД.

    • Для конфигурации без Pangolin Manager:

      export PANGOLIN_MAJOR_OLD_VER=06
      sudo -iu postgres /usr/pangolin/bin/pg_ctl reload -D /pgdata/$PANGOLIN_MAJOR_OLD_VER/data
    • Для конфигурации с Pangolin Manager:

      sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername

Шаг 2. Подготовительные действия

  1. (master, replica, arbiter) Запустите скрипт с базовыми проверками, определяющими готовность стенда к обновлению. Для этого создайте файл pangolin_checks.sh и заполните его содержимым представленным ниже:

    export PANGOLIN_OLD_VER=6.x
    sudo touch ~/pangolin/cache/pangolin_checks.sh
    sudo chmod 0700 ~/pangolin/cache/pangolin_checks.sh

    sudo STAND=<роль ноды> CONFIGURATION=<тип конфигурации> ./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/pangolin-pooler/pangolin-pooler.ini" "/usr/lib/systemd/system/pangolin-pooler.service" "/usr/local/bin/pangolin-pooler" "/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt" "/usr/lib/systemd/system/pangolin-auth-reencrypt@.service" "/etc/pangolin-auth-reencrypt/enc_util.cfg" "/opt/pangolin-certs-rotate/bin/pangolin-certs-rotate" "/usr/lib/systemd/system/pangolin-certs-rotate.service" "/etc/pangolin-certs-rotate/pangolin-certs-rotate.yml")
    if [ "$CONFIGURATION" = "cluster" ]; then
    if [ "$STAND" != "arbiter" ]; then
    additional_files=("/usr/lib/systemd/system/pangolin-manager.service" "/etc/pangolin-manager/postgres.yml")
    fi
    else
    if [ "$STAND" != "arbiter" ]; then
    additional_files=("/usr/pangolin-6.5/share/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=("pangolin-pooler" "pangolin-certs-rotate" "pangolin-auth-reencrypt@postgres.service" "pangolin-auth-reencrypt@kmadmin_pg.service")
    if [ "$CONFIGURATION" = "cluster" ]; then
    if [ "$STAND" != "arbiter" ]; then
    additional_services=("pangolin-manager")
    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="pangolin-dbms-$PANGOLIN_OLD_VER"
    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" | head -1 | awk '{print $2}')

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

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

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

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

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

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

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

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

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

  2. (master, replica, arbiter) Скачайте дистрибутив в рабочий каталог и распакуйте его. Далее по инструкции путь к компонентам дистрибутива будет формироваться с использованием префикса ~/pangolin.

    Действие по скачиванию дистрибутива:

    mkdir -p ~/pangolin/pangolin_710
    sudo tar -xzf installer_sberlinux9-D-07.001.00-distrib.tar.gz -C ~/pangolin/pangolin_710
  3. (master) Сохраните исходные значения стенда для последующей инициализации новой БД:

    sudo -iu postgres psql -c "SHOW SERVER_ENCODING;" > current_value.txt
    sudo -iu postgres psql -c "SHOW LC_COLLATE;" >> current_value.txt
    sudo -iu postgres psql -c "SHOW LC_CTYPE;" >> current_value.txt
    sudo -iu postgres psql -c "SHOW LC_MESSAGES;" >> current_value.txt
    sudo -iu postgres psql -c "SHOW LC_MONETARY;" >> current_value.txt
    sudo -iu postgres psql -c "SHOW LC_NUMERIC;" >> current_value.txt
    sudo -iu postgres psql -c "SHOW LC_TIME;" >> current_value.txt
    sudo -iu postgres psql -c "SELECT oid, pg_tablespace_location(oid) FROM pg_tablespace WHERE spcname not in ('pg_default', 'pg_global');" >> current_value.txt
  4. (master, replica) Разверните виртуальное окружение и перезапустите сессию пользователей: postgres, kmadmin_pg:

    export PANGOLIN_VER=7.1.0
    sudo tar -xz -f ~/pangolin/pangolin_710/3rdparty/3rdparty.tar.gz -C ~/pangolin/pangolin_710/3rdparty/
    sudo dnf install -y ~/pangolin/pangolin_710/3rdparty/pangolin-ansible-venv-controlled-$PANGOLIN_VER-sberlinux9.x86_64.rpm
    sudo systemctl restart user@$(id -u postgres)
    sudo systemctl restart user@$(id -u kmadmin_pg)
  5. (master) Подготовьте исходную базу для корректной миграции:

    sudo -iu postgres

    echo "
    SELECT grant_opts AS grant_opts_start FROM (SELECT unnest(proacl) AS grant_opts FROM pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11) AS all_grants, pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11 AND NOT (grant_opts = any( acldefault('f', proowner)));
    SELECT revoke_opts AS revoke_opts_start FROM (SELECT unnest(acldefault('f', proowner)) AS revoke_opts FROM pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11) AS all_defs, pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11 AND NOT (revoke_opts = any(proacl));
    SELECT grant_opts AS grant_opts_stop FROM (SELECT unnest(proacl) AS grant_opts FROM pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11) AS all_grants, pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11 AND NOT (grant_opts = any( acldefault('f', proowner)));
    SELECT revoke_opts AS revoke_opts_stop FROM (SELECT unnest(acldefault('f', proowner)) AS revoke_opts FROM pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11) AS all_defs, pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11 AND NOT (revoke_opts = any(proacl));
    " > /home/postgres/change_0.sql

    echo "
    DELETE FROM pg_depend using (SELECT c.oid AS c_id, p.oid AS p_id, p.proname FROM pg_catalog.pg_class c join pg_catalog.pg_proc p ON c.relname = 'pg_proc' JOIN pg_catalog.pg_namespace ns ON p.pronamespace=ns.oid AND ns.nspname='pg_catalog') flt WHERE pg_depend.refclassid=flt.c_id AND pg_depend.refobjid = flt.p_id AND pg_depend.deptype ='p' AND pg_depend.classid=0 AND pg_depend.objid=0 AND pg_depend.objsubid=0 AND flt.proname IN (SELECT unnest(string_to_array('check_role_params,check_roles_is_on',',')));
    DROP FUNCTION IF EXISTS pg_catalog.check_role_params(role text, settings_to_check text), pg_catalog.check_roles_is_on();
    " > /home/postgres/change_1.sql

    echo "
    UPDATE pg_proc SET proacl = NULL WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11;
    UPDATE pg_proc SET proacl = NULL WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11;
    UPDATE pg_proc SET proacl = NULL WHERE proname = 'pg_stop_backup' AND cardinality(proargtypes) = 0 AND pronamespace = 11;
    " > /home/postgres/change_2.sql

    echo "

    databases=(\$(\$PGHOME_CLIENT/bin/psql -t --csv -c \"SELECT datname FROM pg_database WHERE datname not in ('template0', 'template1');\"))
    echo \"databases: \" \$databases
    for ud in \"\${databases[@]}\"; do
    echo \"databases: \" \$ud
    \$PGHOME_CLIENT/bin/psql -d \$ud -f /home/postgres/change_0.sql -1
    done

    databases=(\$(\$PGHOME_CLIENT/bin/psql -t --csv -c \"SELECT datname FROM pg_database;\"))
    echo \"databases: \" \$databases
    for ud in \"\${databases[@]}\"; do
    echo \"database: \" \$ud
    \$PGHOME_CLIENT/bin/psql -c \"UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';\"
    \$PGHOME_CLIENT/bin/psql -d \$ud -f /home/postgres/change_1.sql -1
    \$PGHOME_CLIENT/bin/psql -c \"UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';\"
    done

    databases=(\$(\$PGHOME_CLIENT/bin/psql -t --csv -c \"SELECT datname FROM pg_database WHERE datname not in ('template0', 'template1');\"))
    echo \"databases: \" \$databases
    for ud in \"\${databases[@]}\"; do
    echo \"databases: \" \$ud
    \$PGHOME_CLIENT/bin/psql -d \$ud -f /home/postgres/change_2.sql -1
    done
    " > /home/postgres/run_precondition.sh

    chmod 0700 run_precondition.sh
    ./run_precondition.sh >> current_value.txt
    exit
  6. (master, replica) Сформируйте конфигурационные файлы для работы с новой версией:

    mkdir -p ~/pangolin/cache/merge
    # для standalone конфигурации
    sudo cp -r /pgdata/06/data/postgresql.conf ~/pangolin/cache/merge/postgresql.conf
    # для кластерной конфигурации
    sudo cp -r /etc/pangolin-manager/postgres.yml ~/pangolin/cache/merge/postgres.yml

    #точечная актуализация или добавление параметров ~/pangolin/cache/merge/postgresql.conf. Для конфигурации без pangolin-manager
    archive_command = '/opt/pangolin-backup-tools/bin/pg_probackup archive-push -B /pgarclogs/07 --instance clustername --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 4 --batch-size=100'
    log_directory = '/pangolinlogs/pangolin-dbms'
    pg_plugins_path = /opt/pangolin-dbms-server-7/lib
    hba_file = '/pgdata/07/data/pg_hba.conf'
    ident_file = '/pgdata/07/data/pg_ident.conf'

    #точечная актуализация или добавление параметров ~/pangolin/cache/merge/postgres.yml. Для конфигурации с Pangolin Manager.
    postgresql:
    bin_dir: /opt/pangolin-dbms-server-7/bin
    bin_dir_client: /opt/pangolin-dbms-client-7/bin
    data_dir: /pgdata/07/data/
    parameters:
    archive_command: /opt/pangolin-backup-tools/bin/pg_probackup archive-push -B /pgarclogs/07 --instance clustername --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 4 --batch-size=100
    pg_plugins_path: /opt/pangolin-dbms-server-7/lib
  7. (master, replica) Актуализируйте .bash_profile и sudoers:

    sudo sed -i 's/PGHOME=\/usr\/pangolin-6.5/PGHOME=\/opt\/pangolin-dbms-server-7/g'                                 /home/postgres/.bash_profile
    sudo sed -i 's/PGHOME_CLIENT=\/usr\/pangolin-dbms-client-6.5/PGHOME_CLIENT=\/opt\/pangolin-dbms-client-7/g' /home/postgres/.bash_profile
    sudo sed -i 's/PG_LICENSE_PATH=\/opt\/pangolin_license/PG_LICENSE_PATH=\/opt\/pangolin-license/g' /home/postgres/.bash_profile
    sudo sed -i 's/pgdata\/06/pgdata\/07/g' /home/postgres/.bash_profile
    sudo sed -i 's/pgerrorlogs\/06/pangolinlogs\/pangolin-dbms/g' /home/postgres/.bash_profile
  8. (master) Проверьте отсутствие большого количества транзакций с незавершенным статусом. Для этого выполните следующий запрос:

    sudo -iu postgres
    psql
    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;

    Результат выполнения данного запроса — таблица с колонками datname (имя БД) и clog_cnt (количество файлов clog). Если результат запроса будет не пустой, то для всех полученных БД необходимо выполнить команду: vacuumdb -v -d db_name, где db_name - имя БД, полученное в результате выполнения запроса выше.

  9. (master) Выполните проверку состояния близости БД к пороговому значению заморозки транзакций 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
    ;
    Результат выполнения запроса

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

    • db - в какой БД найдена таблица;

    • reason - причина попадания таблицы в выборку:

      • table autovacuum_freeze_max_age - превышено 80% порога индивидуального порога таблицы;
      • TOAST autovacuum_freeze_max_age - 80% порога, заданного на этой таблице по ее TOAST (toast.autovacuum_freeze_max_age);
      • mview autovacuum_freeze_max_age - 80% индивидуального порога по mview, необходимо увеличить значение параметра autovacuum_freeze_max_age через команду ALTER MATERIALIZED VIEW;
      • SYSTEM autovacuum_freeze_max_age - превышено 80% системного autovacuum_freeze_max_age;
    • tab_schema - схема таблицы для table/mview, схема родительской таблицы для TOAST;

    • tabname - имя table/mv, имя родительской таблицы у тоста;

    • tab_frozen_age - возраст старейшей замороженной транзакции table/mview/TOAST;

    • force_freeze_age - порог table/mview/TOAST для индивидуальных порогов или current_setting('autovacuum_freeze_max_age') для системного порога.

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

    • Выполните команду vacuumdb -a -F -v (заморозка транзакций в кластере баз). В случае если команда отрабатывает некорректно — рекомендуется выполнить следующие действия:
      • Удалите старые подготовленные транзакции;
      • Завершите длительные и бездействующие транзакции;
      • Удалите старые слоты репликации;
      • Разрешите конфликты репликации на репликах или выключите конфликтующие реплики.
      • Затем повторите vacuumdb -a -F -v. За подробностями можно обратиться к документу Server Administration, раздел Routine Database Maintenance Tasks - Routine Vacuuming, глава «Preventing Transaction ID Wraparound Failures»;
    • Увеличьте значение параметра autovacuum_freeze_max_age системное/для таблиц исходя из формулы: autovacuum_freeze_max_age > tab_frozen_age / 80% .

Шаг 3. Остановка компонентов СУБД Pangolin

  1. (master, replica) Переименуйте директорию с лицензией:

    sudo mv opt/pangolin_license opt/pangolin-license
  2. (master) В случае конфигурации с Pangolin Manager. Переведите компонент в режим паузы:

    sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=true' --force
  3. (master, replica) Перед остановкой необходимо выполнить команду CHECKPOINT на мастере. Остановите все компоненты СУБД Pangolin:

    sudo systemctl stop pangolin-pooler
    sudo systemctl stop pangolin-certs-rotate
    sudo systemctl stop pangolin-auth-reencrypt@postgres
    sudo systemctl stop pangolin-auth-reencrypt@kmadmin_pg

    Дополнительно выполните:

    • Для конфигурации без Pangolin Manager:

      sudo systemctl stop postgresql
    • Для конфигурации с Pangolin Manager:

      export PANGOLIN_MAJOR_OLD_VER=0x
      sudo -iu postgres /usr/pangolin/bin/pg_ctl stop -D /pgdata/$PANGOLIN_MAJOR_OLD_VER/data
      sudo systemctl stop pangolin-manager
    • Для конфигурации с etcd:

      sudo systemctl stop etcd
  4. (replica, master, arbiter) Остановите сторонние компоненты:

    sudo systemctl stop crond

Шаг 4. Обновление компонента pangolin-auth-reencrypt

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_VER=7.1.0
    sudo dnf install -y ~/pangolin/pangolin_710/utilities/pangolin-auth-reencrypt-$PANGOLIN_VER-sberlinux9.x86_64.rpm
  2. (master, replica) Точечно замените конфигурационный файл, ввиду изменения наименований компонентов, путей к файлам подключения к VAULT и пути к защищенному хранилищу:

    Для кластерной конфигурации:

    sudo sed -i "s/\/etc\/postgres\/enc_utils_auth_settings.cfg/\/etc\/pangolin-auth-encryption\/enc_utils_auth_settings.cfg/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
    sudo sed -i "s/\/etc\/postgres\/enc_connection_settings.cfg/\/etc\/pangolin-security-utilities\/enc_connection_settings.cfg/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
    sudo sed -i "s/\/etc\/postgres\/enc_connection_settings_cert.cfg/\/etc\/pangolin-security-utilities\/enc_connection_settings_cert.cfg/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
  3. (master, replica) Создайте каталог для логов компонента:

    export PGLOGS=/pangolinlogs/pangolin-dbms
    sudo mkdir -p $PGLOGS/pangolin-auth-reencrypt/
    sudo chown postgres:pangolin_users $PGLOGS/pangolin-auth-reencrypt/
    sudo chmod 0770 $PGLOGS/pangolin-auth-reencrypt/

Шаг 5. Обновление компонента pangolin-certs-rotate

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_VER=7.1.0
    sudo dnf install -y ~/pangolin/pangolin_710/utilities/pangolin-certs-rotate-$PANGOLIN_VER-sberlinux9.x86_64.rpm
  2. (master, replica) Точечно замените конфигурационный файл, ввиду изменения наименований компонентов:

    sudo sed -i "s/\/pgerrorlogs\/06/\/pangolinlogs/g" /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml

Шаг 6. Обновление компонента pangolin-diagnostic-tool

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_VER=7.1.0
    sudo dnf install -y ~/pangolin/pangolin_710/utilities/pangolin-diagnostic-tool-$PANGOLIN_VER-sberlinux9.x86_64.rpm

Шаг 7. Обновление компонентов пакета pangolin-security-utilities

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_VER=7.1.0
    sudo dnf install -y ~/pangolin/pangolin_710/utilities/pangolin-security-utilities-$PANGOLIN_VER-sberlinux9.x86_64.rpm
  2. (master, replica) Проверьте присутствует ли на стенде файл secret_dump_key.bin:

    sudo ls -la /etc/pangolin-security-utilities/secret_dump_key.bin
Внимание!

Выполните следующие шаги только при отсутствии файла secret_dump_key.bin. При наличии — повторное создание не требуется и дальнейшие действия не выполняются, переходите к шагу 8.

При отсутствии файла secret_dump_key.bin в зависимости от конфигурации выполните:

  1. Создайте файл для хранения ключа засекречивания:

    /opt/pangolin-security-utilities/bin/pg_dump_generate_secret_file

Шаг 8. Обновление компонентов пакета pangolin-backup-tools

  1. (master, replica) Обновите пакет pangolin-backup-tools-venv (обязательная зависимость для pangolin-backup-tools), либо установите его, если он отсутствует:

    export PANGOLIN_BACKUP_TOOLS=2.1.0
    sudo dnf install -y ~/pangolin/pangolin_710/3rdparty/pangolin-backup-tools-venv/pangolin-backup-tools-venv-$PANGOLIN_BACKUP_TOOLS-sberlinux9.x86_64.rpm
  2. (master, replica) Обновите пакет компонента:

    export PANGOLIN_BACKUP_TOOLS=2.1.0
    sudo dnf install -y ~/pangolin/pangolin_710/pangolin-backup-tools-$PANGOLIN_BACKUP_TOOLS-sberlinux9.x86_64.rpm
  3. (master, replica) Актуализируйте конфигурационный файл backup-tools-env согласно шаблону ниже, если установка компонента первичная. Файл backup-tools-env находится в /etc/pangolin-backup-tools/.

    backup-tools-env

    backup-tools-env:

    # PATH, used for access to required executable files, default value: "${PATH}:{PGHOME}/bin/"
    PATH="${PATH}:/opt/pangolin-dbms-server-7/bin/"
    # path to PGHOME, default value: "/opt/pangolin-backup-tools/bin"
    PGHOME="/opt/pangolin-backup-tools"
    # path to python libraries, required for manage_backup.bin, default value: "/opt/pangolin-backup-tools/lib/python3/site-packages"
    PYTHONPATH="/opt/pangolin-backup-tools/lib/python3/site-packages"
    # path to libraries, required for executable files, default value: "/opt/pangolin-backup-tools/lib"
    LD_LIBRARY_PATH="/opt/pangolin-backup-tools/lib"
    # path to plugins libraries, default value: "/opt/pangolin-backup-tools/lib"
    PG_PLUGINS_PATH="/opt/pangolin-backup-tools/lib"

    # Pangolin DBMS server IP, default value: "127.0.0.1"
    ARG_KEY_DBMS_SERVER_IP="127.0.0.1"
    # Pangolin DBMS port, default value: "5433"
    ARG_KEY_DBMS_SERVER_PORT="5433"
    # user used for access to database, default value: "backup_user"
    ARG_KEY_DBMS_CONNECT_USER="backup_user"
    # database to connect, default value: "postgres"
    ARG_KEY_DBMS_CONNECT_DATA_BASE="postgres"
    # path to backup storage, default value: "/pgarclogs"
    ARG_KEY_DBMS_CONNECT_BACKUP_DIR="/pgarclogs/07"
    # password to connect to Pangolin DBMS, default value: 'sample_password'
    # cluster name, default value: "clustername"
    PGINSTANCE="clustername"
    # WAL archives list
    WALSTATE_FILE="$ARG_KEY_DBMS_CONNECT_BACKUP_DIR/wals_to_delete"
    # Log file
    LOG_FILE="$ARG_KEY_DBMS_CONNECT_BACKUP_DIR/archive.log"
    # path to script, used for creating backup files, default value: "/opt/pangolin-backup-tools/bin/manage_backup.sh"
    MANAGE_BACKUP_SCRIPT="/opt/pangolin-backup-tools/bin/manage_backup.sh"

    # setting up of connection string
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS --host $ARG_KEY_DBMS_SERVER_IP"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -p $ARG_KEY_DBMS_SERVER_PORT"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -U $ARG_KEY_DBMS_CONNECT_USER"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -d $ARG_KEY_DBMS_CONNECT_DATA_BASE"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -B $ARG_KEY_DBMS_CONNECT_BACKUP_DIR"

    # environment variables to launch manage backup
    export PATH
    export PGHOME
    export PYTHONPATH
    export LD_LIBRARY_PATH
    export PG_PLUGINS_PATH
    Предупреждение!

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

    :::

Шаг 9. Обновление компонента Pangolin Pooler

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_POOLER=1.5.2
    sudo dnf install -y ~/pangolin/pangolin_710/pangolin-pooler-$PANGOLIN_POOLER-sberlinux9.x86_64.rpm
    sudo sed -i "s/\/pgerrorlogs\/06/\/pangolinlogs/g" /etc/pangolin-pooler/pangolin-pooler.ini
  2. Восстановите pangolin-pooler-restart.sh

    sudo cp -ra ~/pangolin/cache/backup/manager/pangolin-pooler-restart.sh   /opt/pangolin-pooler/bin/

Шаг 10. Обновление компонента Pangolin Manager

Внимание!

В случае конфигурации с DCS, произведите дополнительно обновление на узле arbiter.

  1. (master, replica) Сделать бэкап .service-файла компонента Pangolin Manager на всех узлах СУБД:

    • Без функциональности «Отказ от root»:

      cp /etc/systemd/system/pangolin-manager.service /home/<username>
    • С функциональностью «Отказ от root»:

      cp /home/postgres/.config/systemd/user/pangolin-manager.service /home/<username>
  2. (master, replica) Для начала процесса обновления компонента, произведите удаление текущей версии компонента и его зависимости:

    export PANGOLIN_MANAGER_VENV=2.1.0
    export PANGOLIN_MANAGER=2.2.1
    export PANGOLIN_VER=7.1
    export PANGOLIN_OLD_VER=6.5
    sudo dnf remove -y ~/pangolin/pangolin-manager-$PANGOLIN_OLD_VER
    sudo dnf remove -y ~/pangolin/pangolin-manager-venv

  3. (master, replica) Произведите обновление пакета компонента (pangolin-manager) и его обязательной зависимости (pangolin-manager-venv), либо установите, если она отсутствует:

    tar -xzf ~/pangolin_710/3rdparty/3rdparty.tar.gz -C 3rdparty/
    cd 3rdparty
    sudo dnf install -y pangolin-manager-venv-$PANGOLIN_MANAGER_VENV-sberlinux8.x86_64.rpm
    cd ../
    sudo dnf install -y ~/pangolin_710/pangolin-manager-$PANGOLIN_MANAGER-sberlinux8.x86_64.rpm
    sudo sed -i "s/$PANGOLIN_OLD_VER/$PANGOLIN_VER/g" /etc/pangolin-manager/postgres.yml

    # Добавьте в файл /etc/pangolin-manager/postgres.yml параметр в секцию postgresql, если его нет
    bin_dir_client: /usr/pangolin-dbms-client-$PANGOLIN_VER/bin
  4. (master, replica) Восстановите .service-файла компонента Pangolin Manager в то же место, где он находился ранее:

    • Без функциональности «Отказ от root»:

      cp /home/<username>/pangolin-manager.service /etc/systemd/system/
    • С функциональностью «Отказ от root»:

      cp /home/<username>/pangolin-manager.service /home/postgres/.config/systemd/user/
  5. (arbiter) Для конфигурации с DCS выполните данный шаг только на узле арбитр:

    sudo chmod -R 0440 /opt/pangolin-manager/lib/plugins/ /opt/pangolin-manager/lib/libfe_elog.so
    sudo chmod 0770 /opt/pangolin-manager /opt/pangolin-manager/bin /opt/pangolin-manager/lib /opt/pangolin-manager/lib/plugins
    sudo chown postgres:pangolin_users /opt/pangolin-manager /opt/pangolin-manager/bin /opt/pangolin-manager/lib /opt/pangolin-manager/lib/plugins /opt/pangolin-manager/lib/libfe_elog.so

Шаг 11. Обновление pangolin_license

  1. (master, replica) Подготовьте файл с лицензией:

    sudo mkdir /opt/pangolin-license/
    sudo touch /opt/pangolin-license/license.json

    #заполните файл /opt/pangolin-license/license.json

    sudo chown -R postgres:pangolin_users /opt/pangolin-license/
    sudo chmod 0770 /opt/pangolin-license/
    sudo chmod 0440 /opt/pangolin-license/license.json

    #заполните файл /opt/pangolin_license/license.json

Шаг 12. Обновление серверной и клиентской части (pangolin-dbms)

  1. (master, replica) Подготовьте СУБД Pangolin новой версии для миграции.

    • Создайте новые рабочие каталоги и файлы БД:

      sudo mkdir -p /pgarclogs/07 /pangolinlogs /pgdata/07/data
      sudo chown -R postgres:postgres /pgdata/07 /pgarclogs/07 /pangolinlogs
      sudo chmod -R 0700 /pgdata/07 /pgarclogs/07 /pangolinlogs
    • Создайте и внесите в файл ~/pangolin/cache/pangolin-dbms следующее содержимое:

      /pgarclogs/07/postgresql-*.log {
      rotate 30
      su postgres postgres
      daily
      compress
      delaycompress
      nocreate
      copytruncate
      sharedscripts
      missingok
      notifempty
      }

      postrotate
      SIZE_USED=\$(df /pgarclogs/07| awk '{print $5}' | grep -v Use% | tr -d %)
      if [ \"\$SIZE_USED\" -gt 90 ]; then
      logger \"Диск для логов PostgreSQL заполнен более чем на 90%. Пожалуйста, очистите его для успешной работы.\"
      fi
      endscript
    • Скопируйте подготовленный файл и назначьте права:

      sudo cp -r ~/pangolin/cache/pangolin-dbms /etc/logrotate.d/pangolin-dbms
      sudo chown root:root /etc/logrotate.d/pangolin-dbms
      sudo chmod 0644 /etc/logrotate.d/pangolin-dbms
    • Обновите пакеты компонентов:

      export PANGOLIN_VER=7.1.0
      sudo dnf install -y ~/pangolin/pangolin_710/pangolin-dbms-7.1-$PANGOLIN_VER-sberlinux9.x86_64.rpm
      sudo dnf install -y ~/pangolin/pangolin_710/pangolin-dbms-7.1-client-$PANGOLIN_VER-sberlinux9.x86_64.rpm

      При необходимости установите пакет компонента timescaledb:

      export PANGOLIN_TIMESCALEDB=2.19.3
      sudo dnf install -y ~/pangolin/pangolin_710/timescaledb/pangolin-timescaledb-7.1-apache-$PANGOLIN_TIMESCALEDB-sberlinux9-x86_64.rpm
    • Скопируйте вспомогательные файлы:

      sudo mkdir /usr/pangolin/3rdparty/
      sudo cp -rf ~/pangolin/3rdparty/* /usr/pangolin/3rdparty/
      sudo chown -R postgres:postgres /usr/pangolin/3rdparty/
      sudo chmod -R 0700 /usr/pangolin/3rdparty/
  2. (master) Инициализируйте новую версию СУБД Pangolin:!!!!

    sudo /opt/pangolin-ansible-venv-controlled/bin/python3 ~/pangolin/pangolin_710/installer/utilities/psql_get_password_hash -t scram-sha-256 -P '<password_postgres>' > ~/pangolin/cache/.tmp_file
    sudo cp -r ~/pangolin/cache/.tmp_file /home/postgres/
    sudo chown postgres:postgres /home/postgres/.tmp_file

    sudo -iu postgres /opt/pangolin-dbms-server/bin/initdb -D /pgdata/07/data -k -A scram-sha-256 --pwfile /home/postgres/.tmp_file -E UTF8 --update-authid --lc-collate <данные из файла current_value.txt> --lc-ctype <данные из файла current_value.txt> --lc-messages <данные из файла current_value.txt> --lc-monetary <данные из файла current_value.txt> --lc-numeric <данные из файла current_value.txt> --lc-time <данные из файла current_value.txt>

    Пример заполненной команды:

    sudo -iu postgres /opt/pangolin-dbms-server/bin/initdb -D /pgdata/07/data -k -A scram-sha-256 --pwfile /home/postgres/.tmp_file -E UTF8 --update-authid --lc-collate en_US.utf-8 --lc-ctype en_US.utf-8 --lc-messages en_US.utf8 --lc-monetary en_US.utf8 --lc-numeric en_US.utf8 --lc-time en_US.utf8
  3. (master, replica) Скопируйте заранее сформированные конфигурационные файлы каталога в рабочие:

    sudo cp -r /pgdata/06/data/pg_hba.conf            /pgdata/07/data/pg_hba.conf
    sudo cp -r /pgdata/06/data/postgresql.base.conf /pgdata/07/data/postgresql.base.conf
    sudo cp -r /pgdata/06/data/postgresql.auto.conf /pgdata/07/data/postgresql.auto.conf

    Для конфигурации без Pangolin Manager:

    sudo cp -r ~/pangolin/cache/merge/postgresql.conf /pgdata/07/data/postgresql.conf

    Для конфигурации с Pangolin Manager:

    sudo cp -r ~/pangolin/cache/merge/postgres.yml    /etc/pangolin-manager/postgres.yml
    sudo cp -r /pgdata/06/data/patroni.dynamic.json /pgdata/07/data/patroni.dynamic.json

    Определите правильные права и владельцев файлов:

    sudo chown postgres:postgres /pgdata/07/data/postgresql.base.conf /pgdata/07/data/postgresql.auto.conf /pgdata/07/data/postgresql.conf /pgdata/07/data/pg_hba.conf /etc/pangolin-manager/postgres.yml /pgdata/07/data/patroni.dynamic.json
    sudo chmod 0700 /pgdata/07/data/postgresql.base.conf /pgdata/07/data/postgresql.auto.conf /pgdata/07/data/postgresql.conf /pgdata/07/data/pg_hba.conf /etc/pangolin-manager/postgres.yml /pgdata/07/data/patroni.dynamic.json
  4. (master, replica) Скорректируйте сервисный файл /etc/systemd/system/postgresql.service для конфигурации без Pangolin Manager:

    echo "
    [Unit]
    Description=Runners PostgreSQL service
    After=syslog.target network.target pangolin-auth-reencrypt@postgres.service pangolin-auth-reencrypt@kmadmin_pg.service

    [Service]
    Type=notify

    Environment=\"PG_LICENSE_PATH=/opt/pangolin-license\"
    Environment=\"PG_PLUGINS_PATH=/opt/pangolin-dbms-server-7/lib\"
    Environment=\"PGCTLTIMEOUT=120\"
    Environment=\"LD_LIBRARY_PATH=/opt/pangolin-dbms-server-7/lib\"
    LimitNOFILE=65536

    # Pre-commands to start watchdog device
    User=postgres
    Group=postgres

    PermissionsStartOnly=true
    ExecStartPre=/bin/mkdir -p /var/run/postgresql
    ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql
    ExecReload=/bin/kill -HUP \$MAINPID

    WorkingDirectory=/opt/pangolin-dbms-server-7/
    ExecStart=/bin/bash -i -c \"/opt/pangolin-dbms-server-7/bin/postgres -D /pgdata/07/data\"
    Restart=on-failure

    [Install]
    WantedBy=multi-user.target
    " > ~/pangolin/cache/postgresql.service
    sudo cp -r ~/pangolin/cache/postgresql.service /etc/systemd/system/postgresql.service
    sudo chown -R postgres:postgres /etc/systemd/system/postgresql.service
    sudo chmod -R 0600 /etc/systemd/system/postgresql.service
    sudo systemctl daemon-reload
  5. (master, replica) Внесите следующие корректировки для миграции:

    sudo sed -i '1ilocal all postgres scram-sha-256 #tmp_line'     /pgdata/06/data/pg_hba.conf
    sudo sed -i '1ilocal all postgres scram-sha-256 #tmp_line' /pgdata/07/data/pg_hba.conf
    sudo sed -i -e "\$aautovacuum = 'off' #tmp_line" /pgdata/06/data/postgresql.conf
    sudo sed -i -e "\$asynchronous_commit = 'off' #tmp_line" /pgdata/06/data/postgresql.conf
    sudo sed -i -e "\$acron.database_name = 'template1' #tmp_line" /pgdata/06/data/postgresql.conf
    sudo sed -i -e "\$aautovacuum = 'off' #tmp_line" /pgdata/07/data/postgresql.conf
    sudo sed -i -e "\$asynchronous_commit = 'off' #tmp_line" /pgdata/07/data/postgresql.conf
    sudo sed -i -e "\$acron.database_name = 'template1' #tmp_line" /pgdata/07/data/postgresql.conf
  6. (master) Мигрируйте данные в новую СУБД с помощью pg_upgrade:

    sudo mkdir -p /pgarclogs/pg_upgrade /var/run/postgresql/pg_upgrade
    sudo chown -R postgres:postgres /pgarclogs/pg_upgrade /var/run/postgresql/pg_upgrade
    sudo chmod -R 0700 /pgarclogs/pg_upgrade /var/run/postgresql/pg_upgrade
    sudo sed -i 's/PGHOST=<ip_host>/PGHOST=localhost/g' /home/postgres/.bash_profile


    export PANGOLIN_OLD_VER=6.5
    export PGPASSWORD=P@sswordFishSword123
    sudo -iu postgres PGPASSWORD=$PGPASSWORD PG_LICENSE_PATH=/opt/pangolin-license PGHOST=127.0.0.1 /opt/pangolin-dbms-server-7/bin/pg_upgrade -b /usr/pangolin-$PANGOLIN_OLD_VER/bin/ -B /opt/pangolin-dbms-server-7/bin/ --old-bindirclient /usr/pangolin-dbms-client/bin/ --new-bindirclient /opt/pangolin-dbms-client-7/bin/ -d /pgdata/06/data -D /pgdata/07/data -p 5433 -P 50433 -j 2 --socketdir=/var/run/postgresql/pg_upgrade -l /pgarclogs/pg_upgrade --link -r
    Внимание!

    При предустановленном в СУБД расширении timescaledb, в строку запуска утилиты pg_upgrade, требуется добавить дополнительный флаг -c timescaledb.restoring='on'.

    Пример

    Если в процессе обновления возникает ошибка:

       libpq environment variable PGHOST has a non-local server value: <ip_addres>

    Отредактируйте переменную PGHOST в /home/postgres/.bash_profile, как в примере ниже:

    sudo sed -i 's/PGHOST=<ip_host>/PGHOST=localhost/g'                                                                     /home/postgres/.bash_profile
    Пример

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

    could not load library "$libdir/pg_stat_kcache": ERROR:  This module can only be loaded via shared_preload_libraries

    Или

    2025-07-21 16:28:15.673 MSK [804508] FATAL:  unrecognized configuration parameter "pg_stat_statements.max"
    2025-07-21 16:28:15.673 MSK [804508] HINT: make sure pg_stat_statements is loaded,
    and make sure pg_stat_kcache is present after pg_stat_statements in the shared_preload_libraries setting

    Попробуйте добавить их в параметр shared_preload_libraries, который находится в postgresql.conf, в правильном порядке, как в примере ниже:

       sudo sed -i "s/#shared_preload_libraries = ''/shared_preload_libraries = 'pg_stat_statements,pg_stat_kcache'/g"         /pgdata/07/data/postgresql.conf
  7. (master) Актуализируйте файлы табличных пространств (ТП):

    sudo rm -rf /pgdata/06/tablespaces/<название ТП>/PG_15_202506231
    sudo cp -ra /pgdata/06/tablespaces /pgdata/07/tablespaces

    #Значения для <path> и <oid> необходимо заменить на значения oid и pg_tablespace_location соответственно из файла current_value.txt

    sudo -iu postgres ln -sfn <path> /pgdata/07/data/pg_tblspc/<oid>
    #например, sudo -iu postgres ln -sfn /pgdata/07/tablespaces/Tbl_t /pgdata/07/data/pg_tblspc/16739
  8. (replica) В случае кластерной конфигурации сгенерируйте ключ доступа для переноса данных с мастера на реплику:

    sudo -iu postgres
    postgres mkdir -p /pgarclogs/cache/rsync
    postgres ssh-keygen

    Generating public/private rsa key pair.
    # Введите имя файла, в котором будет сохранен ключ: /pgarclogs/cache/rsync/ssh_key_rsync
    Enter file in which to save the key (/home/postgres/.ssh/id_rsa): /pgarclogs/cache/rsync/ssh_key_rsync
    # Введите ключевую фразу (опционально):
    Enter passphrase (empty for no passphrase): <passphrase or enter>
    # Введите ту же ключевую фразу еще раз (опционально):
    Enter same passphrase again: <passphrase or enter>

    Your identification has been saved in /pgarclogs/cache/rsync/ssh_key_rsync.
    Your public key has been saved in /pgarclogs/cache/rsync/ssh_key_rsync.pub.
    The key fingerprint is:
    SHA256:5VV.........
    The key's randomart image is:
    +---[RSA 3072]----+
    | ==+|
    | .BBo+|
    | .o.=*=+|
    | o..+ +++|
    | S .o = =o|
    | + o *.+|
    | o =. .* |
    | ..oo.+. E|
    | .oo o... |
    +----[SHA256]-----+

    Копирование ssh-ключа с replica на master:

    ssh-copy-id -i /pgarclogs/cache/rsync/ssh_key_rsync postgres@<ip-address_master>
  9. (replica) В случае кластерной конфигурации запустите rsync для переноса данных:

    sshpass -d4 /bin/rsync --delay-updates -F --checksum --archive --rsync-path=rsync --hard-links --progress --size-only --no-inc-recursive --delete --rsh='ssh -S none -i /pgarclogs/cache/rsync/ssh_key_rsync -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' --out-format='<<CHANGED>>%i %n%L' postgres@<ip-address_master>:/pgdata/07 /pgdata
    #если есть табличные пространства, находящиеся в не /pgdata/06, их необходимо тоже перенсти, напрмер: sshpass -d4 /bin/rsync --delay-updates -F --checksum --archive --rsync-path=rsync --hard-links --size-only --stats --dry-run --delete --no-inc-recursive --rsh='ssh -S none -i /pgarclogs/cache/rsync/ssh_key_rsync -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' --out-format='<<CHANGED>>%i %n%L' <ip-address_master>:/pgdata/11/tablespaces/tsin11 /pgdata/11/tablespaces
  10. (master) Проиндексируйте данные в БД, выполните очистку и анализ базы данных:

    export PGPASSWORD=<password_postgres>

    Дополнительно выполните:

  • Для конфигурации без Pangolin Manager:

    • в случае отсутствия postgresql.service:

      sudo -iu postgres
      /usr/pangolin/bin/pg_ctl restart -D /pgdata/06/data/
      exit
    • с наличием файла postgresql.service:

      sudo systemctl restart postgresql
  • Для конфигурации с Pangolin Manager:

    sudo -iu postgres /opt/pangolin-dbms-server/bin/pg_ctl start -D /pgdata/07/data/
  • Для любой конфигурации:

    sudo -iu postgres
    PGPASSWORD=$PGPASSWORD /opt/pangolin-dbms-client-7/bin/reindexdb -j 2 --all
    PGPASSWORD=$PGPASSWORD /opt/pangolin-dbms-client-7/bin/vacuumdb -j 2 --analyze-in-stages --all
    if [ -f /pgarclogs/pg_upgrade/reindex_gin.sql ];
    /opt/pangolin-dbms-client-7/bin/psql < /pgarclogs/pg_upgrade/reindex_gin.sql
    fi
    exit
  • Для конфигурации без Pangolin Manager:

    • в случае отсутствия postgresql.service:

      sudo -iu postgres
      /usr/pangolin/bin/pg_ctl stop -D /pgdata/06/data/
      exit
    • с наличием файла postgresql.service:

      sudo systemctl stop postgresql
  • Для конфигурации с Pangolin Manager:

    sudo -iu postgres /opt/pangolin-dbms-server/bin/pg_ctl stop -D /pgdata/07/data/

Шаг 13. Завершающие действия

  1. (master, replica) Удалите временные параметры из рабочих конфигурационных файлов:

    sudo sed -i '/local all postgres scram-sha-256 #tmp_line/d' /pgdata/07/data/pg_hba.conf
    sudo sed -i "/autovacuum = 'off' #tmp_line/d" /pgdata/07/data/postgresql.conf
    sudo sed -i "/synchronous_commit = 'off' #tmp_line/d" /pgdata/07/data/postgresql.conf
    sudo sed -i "/cron.database_name = 'template1' #tmp_line/d" /pgdata/07/data/postgresql.conf
  2. (master, replica) Удалите неактуальные рабочие файлы исходной БД:

    sudo dnf remove platform-v-pangolin-dbms -y
    sudo rm -rf /usr/pangolin-6* /usr/pgsql-se-06
    sudo ln -sfvn /pgdata/07 /pgdata/data
    sudo rm -rf /pgdata/06 /pgerrorlogs/06 /pgarclogs/06
    sudo rm -rf /etc/postgres/enc_connection_settings.cfg
    sudo rm -rf /etc/postgres/enc_connection_settings_cert.cfg
    sudo rm -rf /etc/postgres/enc_utils_auth_settings.cfg
    sudo rm -rf /etc/postgres/enc_params.cfg*
    sudo rm -rf /opt/omni/lbin/*manage_backup*
    sudo rm -rf /opt/omni/lbin/*pg_se_archlogs*
    sudo rm -rf /etc/systemd/system/pgbouncer.service
    sudo rm -rf /etc/pgbouncer/
    sudo rm -rf /usr/local/bin/pgbouncer
    sudo rm -rf /usr/local/share/doc/pgbouncer/
    sudo rm -rf /usr/local/share//man/man1/pgbouncer.1
    sudo rm -rf /usr/local/share//man/man5/pgbouncer.5
    sudo rm -rf /usr/patroni/patroni_venv
    sudo rm -rf /opt/pangolin-common
  3. (master, replica, arbiter) Актуализируйте dynmotd.sh:

    export PANGOLIN_MANGER=2.2.1
    export PANGOLIN_OLD_MANGER=2.x.x
    export PANGOLIN_FULL_VER=07.001.00
    export PANGOLIN_FULL_OLD_VER=06.00X.XX

    sudo sed -i "s/$PANGOLIN_OLD_MANGER/$PANGOLIN_MANGER/g" /usr/local/sbin/dynmotd.sh
    sudo sed -i "s/$PANGOLIN_FULL_OLD_VER/$PANGOLIN_FULL_VER/g" /usr/local/sbin/dynmotd.sh

Шаг 14. Запуск компонентов СУБД Pangolin

  1. (master, replica) Запустите компоненты СУБД Pangolin:

    sudo systemctl daemon-reload

    sudo systemctl restart pangolin-pooler
    sudo systemctl restart pangolin-certs-rotate
    sudo systemctl restart pangolin-auth-reencrypt@postgres
    sudo systemctl restart pangolin-auth-reencrypt@kmadmin_pg

    Дополнительно выполните:

    • Для конфигурации без Pangolin Manager:

      • в случае отсутствия postgresql.service:

        sudo -iu postgres
        /usr/pangolin/bin/pg_ctl restart -D /pgdata/06/data/
        exit
      • с наличием файла postgresql.service:

        sudo systemctl restart postgresql
    • Для конфигурации с Pangolin Manager:

      sudo systemctl restart pangolin-manager
    • Для конфигурации с etcd:

      sudo systemctl restart etcd
  2. (master) Запустите сторонние сервисы:

    sudo systemctl restart crond
  3. (master) В случае конфигурации с pangolin-manager очистите кластер и выведите pangolin-manager из режима паузы:

    sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml remove clustername
    sudo systemctl restart pangolin-manager
    sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=false' --force
    sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername

    #дополнительно выполните команду на replica
    sudo systemctl restart pangolin-manager
  4. (master) Подготовьте исходную базу для корректной миграции в «Шаг 2. Подготовительные действия» пункт 5.

    примечание

    В файле /home/postgres/current_value.txt необходимо выявить, в какой БД были найдены следующие сущности: grant_opts_start/revoke_opts_start/grant_opts_stop/revoke_opts_stop. Значение необходимо подставить в скрипты вместо <БД>.

    Также необходимо проверить, какому пользователю были выданы права. Например, backup_user=X/postgres, значит <пользователь> заменить на backup_user, если значение =X/postgres, значит <пользователь> заменить на PUBLIC.

    sudo -iu postgres

    #grant_opts_start
    echo "
    SET SESSION AUTHORIZATION <БД>;
    GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start TO <пользователь>;
    RESET SESSION AUTHORIZATION;
    " > /home/postgres/grant_opts_start.sql

    #grant_opts_stop
    echo "
    SET SESSION AUTHORIZATION <БД>;
    GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop TO <пользователь>;
    RESET SESSION AUTHORIZATION;
    " > /home/postgres/grant_opts_stop.sql

    #revoke_opts_start
    echo "
    REVOKE EXECUTE ON FUNCTION pg_catalog.pg_backup_start FROM <пользователь>;
    " > /home/postgres/revoke_opts_start.sql

    #revoke_opts_stop
    echo "
    REVOKE EXECUTE ON FUNCTION pg_catalog.pg_backup_stop FROM <пользователь>;
    " > /home/postgres/revoke_opts_stop.sql
    psql -f /home/postgres/grant_opts_start.sql
    psql -f /home/postgres/grant_opts_stop.sql
    psql -f /home/postgres/revoke_opts_start.sql
    psql -f /home/postgres/revoke_opts_stop.sql
    exit

Шаг 15. Обновление каталога безопасности

  1. (master) Добавьте временный параметр enable_protection_catalogs_upgrade под пользователем postgres в конец конфигурационного файла в зависимости от конфигурации с помощью обычного текстового редактора:

    • Для конфигурации без Pangolin Manager. Отредактируйте конфигурационный файл postgresql.conf:

      enable_protection_catalogs_upgrade = True
    • Для конфигурации c Pangolin Manager. Отредактируйте конфигурационный файл postgres.yml:

      postgresql:
      parameters:
      enable_protection_catalogs_upgrade: True
  2. (master) Произведите reload и restart СУБД в зависимости от конфигурации:

    • Для конфигурации без Pangolin Manager:

      sudo -iu postgres /opt/pangolin-dbms-server/pg_ctl reload -D /pgdata/data/data
      sudo -iu postgres /opt/pangolin-dbms-server/pg_ctl restart -D /pgdata/data/data
    • Для конфигурации c Pangolin Manager:

      sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
      sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
  3. (master) Выполните следующую команду в каждой БД поочередно, кроме БД с включенным флагом datallowconn. <DB> - заменить на название базы данных:

    sudo -iu postgres psql -c "SELECT NOW()" -d <DB>
    exit
  4. (master) Удалите временный параметр enable_protection_catalogs_upgrade из конфигурационного файла в зависимости от конфигурации под пользователем postgres с помощью обычного текстового редактора. И произведите reload и restart СУБД в зависимости от конфигурации:

    • Для конфигурации без Pangolin Manager:

      sudo -iu postgres /opt/pangolin-dbms-server/pg_ctl reload -D /pgdata/data/data
      sudo -iu postgres /opt/pangolin-dbms-server/pg_ctl restart -D /pgdata/data/data
    • Для конфигурации c Pangolin Manager:

      sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
      sudo -iu postgres /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername