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

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

Данный раздел рассматривает ручное обновление с переносом данных СУБД Pangolin с версии 5.4.x/5.5.x до 6.5.x.

Внимание!

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

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

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

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

Важно

Для предотвращения полной переливки данных на резервный узел кластера Pangolin и возможного нарушения доступности сервиса при переходе с версии Pangolin 5.x.x на версию 6.5.x настоятельно рекомендуется заблаговременно произвести операцию VACUUM FREEZE во всех базах данных, либо же после завершения процесса обновления деактивировать режим агрессивного вакуума по переполнению счетчика транзакций (autovacuum_disable_wraparound = on). Необходимо обратить внимание на пункт «Запуск процесса заморозки» в блоке проверки готовности к обновлению.

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

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

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

  • PANGOLIN_VER - новая версия СУБД Pangolin (формат - x.x.x);
  • 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);
  • 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. Проверьте наличие расширений, установленных в схему public или в системный каталог (рекомендуется: перенести в схему ext).

  2. В случае кластерной конфигурации, обновите строку подключения к СУБД (проверьте значение портов) и убедитесь, что в строке указаны оба узла кластера (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
  3. В случае использования расширения timescaledb убедитесь, что обновляемая версия расширения не ниже 2.14.2. В противном случае необходимо сначала обновить расширение до этой версии. Если поднять версию расширения в рамках одной версии СУБД невозможно, следует произвести обновление СУБД на промежуточную, а затем на целевую версию. Уточнение по процессу обновления стендов с предустановленным расширением timescaledb указано в «Таблице поддерживаемых для обновления версий СУБД».

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

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

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

    • general:

      sudo mkdir -p ~/pangolin/cache/backup/general                                                      # дополнительно создать на узле arbiter
      sudo cp -ra /usr/local/sbin/dynmotd.sh ~/pangolin/cache/backup/general/ # дополнительно сохранить на узле arbiter
      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/postgres/enc_connection_settings_cert.cfg ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/postgres/enc_connection_settings.cfg ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/postgres/enc_utils_auth_settings.cfg ~/pangolin/cache/backup/general/
    • Pangolin Pooler:

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

      sudo mkdir -p ~/pangolin/cache/backup/patroni
      sudo cp -ra /etc/systemd/system/patroni.service ~/pangolin/cache/backup/patroni/
      sudo cp -ra /etc/patroni/postgres.yml ~/pangolin/cache/backup/patroni/
      sudo cp -ra /etc/patroni/reload_pgbouncer.sh ~/pangolin/cache/backup/patroni/
      sudo cp -ra /usr/patroni ~/pangolin/cache/backup/patroni/
      sudo cp -ra /pgdata/05/data/patroni.dynamic.json ~/pangolin/cache/backup/patroni/
    • pangolin_reencrypt:

      sudo mkdir -p ~/pangolin/cache/backup/pangolin_reencrypt
      sudo cp -ra /etc/systemd/system/pangolin_reencrypt@.service ~/pangolin/cache/backup/pangolin_reencrypt/
      sudo cp -ra /opt/pangolin-common/bin/pg_auth_reencrypt ~/pangolin/cache/backup/pangolin_reencrypt/
      sudo cp -ra /etc/postgres/enc_util.cfg ~/pangolin/cache/backup/pangolin_reencrypt/
      sudo cp -ra /etc/postgres/enc_params.cfg.kmadmin_pg ~/pangolin/cache/backup/pangolin_reencrypt/
      sudo cp -ra /etc/postgres/enc_params.cfg.postgres ~/pangolin/cache/backup/pangolin_reencrypt/
    • pg_certs_rotate:

      sudo mkdir -p ~/pangolin/cache/backup/pg_certs_rotate_agent
      sudo cp -ra /etc/systemd/system/pg_certs_rotate_agent.service ~/pangolin/cache/backup/pg_certs_rotate_agent/
      sudo cp -ra /opt/pangolin-common/bin/pg_certs_rotate_agent ~/pangolin/cache/backup/pg_certs_rotate_agent/
      sudo cp -ra /etc/postgres/pg_certs_rotate_agent.yml ~/pangolin/cache/backup/pg_certs_rotate_agent/
    • manage_backup:

      sudo mkdir -p ~/pangolin/cache/backup/manage_backup
      sudo cp -ra /opt/omni/lbin/ ~/pangolin/cache/backup/manage_backup/
    • pangolin_dbms:

      export PANGOLIN_OLD_VER={pangolin_old_version}
      sudo mkdir -p ~/pangolin/cache/backup/pangolin_dbms
      sudo dnf download --destdir=/home/<user>/pangolin/cache/backup/pangolin_dbms/ pangolin-dbms
      sudo cp -ra /usr/pangolin-$PANGOLIN_OLD_VER/ ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/postgresql.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/pg_hba.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/postgresql.base.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/postgresql.auto.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/pg_quota.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/pg_ident.conf ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /etc/systemd/system/postgresql.service ~/pangolin/cache/backup/pangolin_dbms/
  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/05/data/pg_hba.conf или в файл /etc/patroni/postgres.yml в секцию pg_hba для конфигурации с patroni.

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

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

      sudo su - postgres
      /usr/pangolin/bin/pg_ctl reload -D /pgdata/05/data
    • Для конфигурации с patroni:

      sudo su - postgres
      /usr/patroni/patroni_venv/bin/patronictl -c /etc/patroni/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) Выполните резервное копирование:

    /usr/pangolin/bin/pg_probackup init -B /pgarclogs/cache/backup/pangolin_dbms
    /usr/pangolin/bin/pg_probackup add-instance -B /pgarclogs/cache/backup/pangolin_dbms -D /pgdata/05/data --instance clustername
    PGPASSWORD=<password_postgres> /usr/pangolin/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/05/data/pg_hba.conf или из файла /etc/patroni/postgres.yml для конфигурации с patroni.

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

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

      sudo su - postgres
      /usr/pangolin/bin/pg_ctl reload -D /pgdata/05/data
    • Для конфигурации с patroni:

      sudo su - postgres
      /usr/patroni/patroni_venv/bin/patronictl -c /etc/patroni/postgres.yml reload clustername

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

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

    mkdir ~/pangolin/cache/
    touch /pangolin/cache/pangolin_checks.sh
    sudo chmod 0700 ~/pangolin/cache/pangolin_checks.sh

    cd ~/ && 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/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.5.х."
    fi
    fi

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

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

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

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

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

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

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

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

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

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

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

    export PANGOLIN_VER=6.5.x
    tar -xz -f 3rdparty/3rdparty.tar.gz
    sudo dnf install -y ~/pangolin/3rdparty/3rdparty/pangolin-ansible-venv-controlled-$PANGOLIN_VER-sberlinux8.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/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/bin/psql -d \$ud -f /home/postgres/change_0.sql -1
    done

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

    databases=(\$(\$PGHOME/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/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) Сформируйте конфигурационные файлы для работы с новой версией:

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

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

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

    export PANGOLIN_OLD_VER=5.5.x
    sudo sed -i '/LD_LIBRARY_PATH/d' /home/postgres/.bash_profile
    sudo sed -i '/PG_PLUGINS_PATH/d' /home/postgres/.bash_profile
    sudo sed -i 's/pgerrorlogs\/05/pgerrorlogs\/06/g' /home/postgres/.bash_profile
    sudo sed -i 's/pgdata\/05/pgdata\/06/g' /home/postgres/.bash_profile
    sudo sed -i "s/$PANGOLIN_OLD_VER/6.5/g" /home/postgres/.bash_profile
    sudo sed -i "s/$PANGOLIN_OLD_VER/6.5/g" /home/postgres/.bash_profile
    sudo sed -i "s/pangolin_reencrypt/pangolin-auth-reencrypt/g" /etc/sudoers.d/10-kmadmin_pg
    sudo sed -i "s/pangolin_reencrypt/pangolin-auth-reencrypt/g" /etc/sudoers.d/10-postgres
    sudo sed -i "s/pg_certs_rotate_agent/pangolin-certs-rotate/g" /etc/sudoers.d/10-postgres
    sudo sed -i "s/pgbouncer/pangolin-pooler/g" /etc/sudoers.d/10-postgres

    Дополнительно для конфигурации с patroni:

    sudo sed -i "s/patronictl/pangolin-manager-ctl/g"                                 /home/postgres/.bash_profile
    sudo sed -i "s/\/usr\/patroni\/patroni_venv\/bin/\/opt\/pangolin-manager\/bin/g" /home/postgres/.bash_profile
    sudo sed -i "s/patroni/pangolin-manager/g" /home/postgres/.bash_profile
    sudo sed -i "s/patroni/pangolin-manager/g" /etc/sudoers.d/10-postgres
  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) В случае конфигурации с patroni. Переведите компонент в режим паузы:

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

    sudo systemctl stop pgbouncer
    sudo systemctl stop pg_certs_rotate_agent
    sudo systemctl stop pangolin_reencrypt@postgres.service
    sudo systemctl stop pangolin_reencrypt@kmadmin_pg.service

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

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

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

      sudo -iu postgres
      /usr/pangolin/bin/pg_ctl stop -D /pgdata/05/data
      exit
      sudo systemctl stop patroni
    • Для конфигурации с etcd:

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

    sudo systemctl stop crond

Шаг 4. Обновление компонента pg_auth_reencrypt

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

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

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

    sudo sed -i "s/\/etc\/patroni\/postgres.yml/\/etc\/pangolin-manager\/postgres.yml/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
    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=/pgerrorlogs/06
    sudo mkdir -p $PGLOGS/pangolin-auth-reencrypt/
    sudo chown postgres:pangolin_users $PGLOGS/pangolin-auth-reencrypt/
    sudo chmod 0770 $PGLOGS/pangolin-auth-reencrypt/

Шаг 5. Обновление компонента pg_certs_rotate_agent

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

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

    sudo sed -i "s/\/pgerrorlogs\/05/\/pgerrorlogs\/06/g" /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml
    sudo sed -i "s/sudo systemctl reload pgbouncer/sudo systemctl reload pangolin-pooler/g" /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml
    sudo sed -i "s/sudo systemctl reload patroni/sudo systemctl reload pangolin-manager/g" /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml

Шаг 6. Обновление компонента diagnostic_tool

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

    export PANGOLIN_VER=6.5.x
    sudo dnf install -y ~/pangolin/utilities/pangolin-diagnostic-tool-$PANGOLIN_VER-sberlinux8.x86_64.rpm

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

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

    export PANGOLIN_VER=6.5.x
    sudo dnf install -y ~/pangolin/utilities/pangolin-security-utilities-$PANGOLIN_VER-sberlinux8.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. Обновление компонентов пакета backup-tools

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

    sudo dnf install -y ~/pangolin/3rdparty/pangolin-backup-tools-venv-{version_component}-sberlinux8.x86_64.rpm
  2. (master, replica) Обновите пакет компонента:

    export PANGOLIN_BACKUP_TOOLS=1.2.2
    sudo dnf install -y ~/pangolin/pangolin-backup-tools-$PANGOLIN_BACKUP_TOOLS-sberlinux8.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}:/usr/pangolin-6.5/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/06"
    # 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.0
    sudo dnf install -y ~/pangolin/pangolin-pooler-$PANGOLIN_POOLER-sberlinux8.x86_64.rpm
    sudo sed -i "s/\/pgerrorlogs\/05/\/pgerrorlogs\/06/g" /etc/pangolin-pooler/pangolin-pooler.ini
  2. (master, replica) Создайте скрипт pangolin-pooler-restart.sh:

    echo "
    #!/bin/sh \
    sudo systemctl restart pangolin-pooler \
    " > ~/pangolin/pangolin-pooler-restart.sh
    sudo cp -r ~/pangolin/pangolin-pooler-restart.sh /etc/pangolin-pooler/pangolin-pooler-restart.sh
    sudo chown postgres:postgres /etc/pangolin-pooler/pangolin-pooler-restart.sh
    sudo chmod 0500 /etc/pangolin-pooler/pangolin-pooler-restart.sh

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

  1. (master, replica) Обновите пакет обязательной зависимости компонента:

    export PANGOLIN_MANAGER_VENV=1.1.0
    sudo dnf install -y ~/pangolin/3rdparty/pangolin-manager-venv-$PANGOLIN_MANAGER_VENV-sberlinux8.x86_64.rpm
  2. (master, replica) Обновите пакет компонента:

    export PANGOLIN_MANAGER=2.1.6
    sudo dnf install -y ~/pangolin/pangolin-manager-$PANGOLIN_MANAGER-sberlinux8.x86_64.rpm

Шаг 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

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

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

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

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

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

      postrotate
      SIZE_USED=\$(df /pgarclogs/06| 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=6.5.x
      export PANGOLIN_TIMESCALEDB=2.19.3
      sudo dnf install -y ~/pangolin/pangolin-dbms-6.5-$PANGOLIN_VER-sberlinux8.x86_64.rpm
      sudo dnf install -y ~/pangolin/pangolin-dbms-6.5-client-$PANGOLIN_VER-sberlinux8.x86_64.rpm

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

      sudo dnf install -y ~/pangolin/timescaledb/pangolin-timescaledb-6.5-apache-$PANGOLIN_TIMESCALEDB-sberlinux8-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/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
    /usr/pangolin/bin/initdb -D /pgdata/06/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>
    exit

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

    /usr/pangolin/bin/initdb -D /pgdata/06/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 ~/pangolin/cache/merge/postgresql.conf /pgdata/06/data/postgresql.conf
    sudo cp -r /pgdata/05/data/pg_hba.conf /pgdata/06/data/pg_hba.conf
    sudo cp -r /pgdata/05/data/postgresql.base.conf /pgdata/06/data/postgresql.base.conf
    sudo cp -r /pgdata/05/data/postgresql.auto.conf /pgdata/06/data/postgresql.auto.conf
    sudo chown postgres:postgres /pgdata/06/data/postgresql.base.conf /pgdata/06/data/postgresql.auto.conf /pgdata/06/data/postgresql.conf /pgdata/06/data/pg_hba.conf /etc/pangolin-manager/postgres.yml /pgdata/06/data/patroni.dynamic.json
    sudo chmod 0600 /pgdata/06/data/postgresql.base.conf /pgdata/06/data/postgresql.auto.conf /pgdata/06/data/postgresql.conf /pgdata/06/data/pg_hba.conf /etc/pangolin-manager/postgres.yml /pgdata/06/data/patroni.dynamic.json

    Дополнительно для конфигурации с patroni:

    sudo cp -r ~/pangolin/cache/merge/postgres.yml    /etc/pangolin-manager/postgres.yml
    sudo cp -r /pgdata/05/data/patroni.dynamic.json /pgdata/06/data/patroni.dynamic.json
  4. (master, replica) Скорректируйте сервисный файл /etc/systemd/system/postgresql.service для конфигурации без patroni:

    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=/usr/pangolin-6.5/lib\"
    Environment=\"PGCTLTIMEOUT=120\"
    Environment=\"LD_LIBRARY_PATH=/usr/pangolin-6.5/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=/usr/pangolin-6.5/
    ExecStart=/bin/bash -i -c \"/usr/pangolin-6.5/bin/postgres -D /pgdata/06/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/05/data/pg_hba.conf
    sudo sed -i '1ilocal all postgres scram-sha-256 #tmp_line' /pgdata/06/data/pg_hba.conf
    sudo sed -i -e "\$aautovacuum = 'off' #tmp_line" /pgdata/05/data/postgresql.conf
    sudo sed -i -e "\$asynchronous_commit = 'off' #tmp_line" /pgdata/05/data/postgresql.conf
    sudo sed -i -e "\$acron.database_name = 'template1' #tmp_line" /pgdata/05/data/postgresql.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
  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 -iu postgres
    export PANGOLIN_OLD_VER=5.5.x
    export PGPASSWORD=<password_postgres>
    PGPASSWORD=$PGPASSWORD PG_LICENSE_PATH=/opt/pangolin_license PGHOST=127.0.0.1 /usr/pangolin-6.5/bin/pg_upgrade -b /usr/pangolin-$PANGOLIN_OLD_VER/bin/ -B /usr/pangolin-6.5/bin/ --old-bindirclient /usr/pangolin-$PANGOLIN_OLD_VER/bin/ --new-bindirclient /usr/pangolin-dbms-client-6.5/bin/ -d /pgdata/05/data -D /pgdata/06/data -p 5433 -P 50433 -j 2 --socketdir=/var/run/postgresql/pg_upgrade -l /pgarclogs/pg_upgrade --link -r
    exit
    Внимание!

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

  7. (master) Актуализируйте файлы табличных пространств (ТП):

    sudo rm -rf /pgdata/05/tablespaces/<название ТП>/PG_13_202306131
    sudo mv /pgdata/05/tablespaces /pgdata/06/tablespaces

    #Значения для <path> и <oid> необходимо заменить на значения oid и pg_tablespace_location соответственно из файла current_value.txt
    sudo ln -sfn <path> /pgdata/06/data/pg_tblspc/<oid>
    #например, sudo ln -sfn /pgdata/06/tablespaces/Tbl_t /pgdata/06/data/pg_tblspc/16799
  8. (replica) В случае кластерной конфигурации сгенерируйте ключ доступа для переноса данных с мастера на реплику:

    sudo -iu postgres
    mkdir -p /pgarclogs/cache/rsync
    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/06 /pgdata
    #если есть табличные пространства, находящиеся в не /pgdata/05, их необходимо тоже перенсти, напрмер: 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:

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

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

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

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

    sudo -iu postgres
    /usr/pangolin/bin/pg_ctl stop -D /pgdata/06/data/
    exit

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

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

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

    sudo dnf remove platform-v-pangolin-dbms -y
    sudo rm -rf /usr/pangolin-5* /usr/pgsql-se-05
    sudo ln -sfvn /pgdata/06 /pgdata/data
    sudo rm -rf /pgdata/05 /pgerrorlogs/05 /pgarclogs/05
    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.1.6
    export PANGOLIN_OLD_MANGER=2.1.1
    export PANGOLIN_FULL_VER=06.005.XX
    export PANGOLIN_FULL_OLD_VER=05.005.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:

      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
    exit
    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
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
    exit

    #дополнительно выполните команду на 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 su - postgres
      /usr/pangolin/bin/pg_ctl reload -D /pgdata/data/data
      /usr/pangolin/bin/pg_ctl restart -D /pgdata/data/data
      exit
    • Для конфигурации c Pangolin Manager:

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

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

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

      sudo su - postgres
      /usr/pangolin/bin/pg_ctl reload -D /pgdata/data/data
      /usr/pangolin/bin/pg_ctl restart -D /pgdata/data/data
      exit
    • Для конфигурации c Pangolin Manager:

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