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

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

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

Внимание!

Перед началом выполнения инструкции необходимо убедиться, что yum/dnf-репозитории настроены корректно. При обновлении пакетов, содержащих эпоху в номере версии, важно учитывать специфику работы пакетных менеджеров. При попытке обновить пакет на новую версию без эпохи, обновление не произойдет. Перед выполнением обновления данных компонентов необходимо предварительно удалить текущий установленный пакет компонента.

Важно

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

Внимание!

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

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

Обновление выполняется покомпонентно. Шаги, соответствующие компонентам, отсутствующим в конфигурации, следует пропустить.

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

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

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

Обозначения

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

  • PANGOLIN_VER_OLD – исходная версия СУБД Pangolin (формат - х.х.х);
  • PANGOLIN_VER – новая версия СУБД Pangolin (формат - х.х.х);
  • PANGOLIN_FULL_VER – новая версия СУБД Pangolin (формат - 0х.00х.0х);
  • PANGOLIN_FULL_VER_OLD – исходная версия СУБД Pangolin (формат - 0х.00х.0х);
  • PANGOLIN_DBMS_MAJOR – новая мажорная версия СУБД Pangolin (формат - х);
  • PANGOLIN_DBMS_MINOR – новая минорная версия СУБД Pangolin (формат - х);
  • PANGOLIN_TIMESCALEDB_OLD – исходная версия расширения timescaledb (формат - х.х.х);
  • PANGOLIN_TIMESCALEDB – новая версия расширения timescaledb (формат - х.х.х);
  • PANGOLIN_TIMESCALEDB_RELEASE – новая версия релиза пакета расширения timescaledb (формат - х.х.х);
  • PANGOLIN_POOLER – новая версия компонента Pangolin Pooler (формат - х.х.х);
  • PANGOLIN_MANAGER_OLD – исходная версия компонента Pangolin Manager (формат - х.х.х);
  • PANGOLIN_MANAGER – новая версия компонента Pangolin Manager (формат - х.х.х);
  • PANGOLIN_MANAGER_VENV – новая версия зависимости pangolin-manager-venv (формат - х.х.х);
  • PANGOLIN_BACKUP_TOOLS – новая версия компонента Pangolin Backup Tools (формат - х.х.х);
  • PANGOLIN_BACKUP_TOOLS_VENV – новая версия зависимости pangolin-backup-tools-venv (формат - х.х.х);
  • PANGOLIN_TUNER_OLD – исходная версия компонента Pangolin Tuner (формат - х.х.х);
  • PANGOLIN_TUNER – новая версия компонента Pangolin Tuner (формат - х.х.х);
  • PANGOLIN_POSTGIS – новая версия пакета стороннего расширения postgis (формат - х.х.х);
  • PANGOLIN_PGROUTING – новая версия пакета стороннего расширения pgrouting (формат - х.х.х);
  • PANGOLIN_PG_BACKGROUND – новая версия пакета стороннего расширения pg_background (формат - х.х.х);
  • PANGOLIN_POSTGIS_RELEASE – новая версия релиза пакета стороннего расширения postgis (формат - х.х.х);
  • PANGOLIN_PGROUTING_RELEASE – новая версия релиза пакета стороннего расширения pgrouting (формат - х.х.х);
  • PANGOLIN_PG_BACKGROUND_RELEASE – новая версия релиза пакета стороннего расширения pg_background (формат - х.х.х);
  • PGPASSWORD - пароль от пользователя БД (по умолчанию пользователь postgres);
  • PGDATA – исходный путь до данных СУБД Pangolin (формат - /pgdata/xx);
  • PGDATA_NEW – новый путь до данных СУБД Pangolin (формат - /pgdata/xx);
  • PGHOME – исходный путь до серверной части СУБД Pangolin (формат - /usr/pangolin-x.x.x);
  • PGHOME_NEW – новый путь до серверной части СУБД Pangolin (формат - /usr/pangolin-x.x);
  • PGHOME_CLIENT – исходный путь до клиентской части СУБД Pangolin (формат - /usr/pangolin-x.x.x);
  • PGHOME_CLIENT_NEW – новый путь до клиентской части СУБД Pangolin (формат - /usr/pangolin-dbms-client-x.x);
  • PGBACKUP – исходный путь для резервного копирования СУБД Pangolin (формат - /pgarclogs/xx);
  • PGBACKUP_NEW – новый путь для резервного копирования СУБД Pangolin (формат - /pgarclogs/xx);
  • PGPORT - порт СУБД Pangolin (по умолчанию 5433);
  • CLUSTERNAME - наименование кластера (по умолчанию clustername).

Предусловие

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

Сведения

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

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

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

Сведения

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

В случае использования расширения timescaledb убедитесь, что обновляемая версия расширения поддерживается и подходит для запланированного сценария обновления. В противном случае необходимо сначала обновить расширение до допустимой версии. Если поднять версию расширения в рамках одной версии СУБД невозможно, следует произвести обновление СУБД на промежуточную, а затем на целевую версию. Уточнение по процессу обновления стендов с предустановленным расширением timescaledb указано в «Таблице поддерживаемых для обновления версий СУБД».

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

Сведения

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

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

  1. Убедитесь в отсутствии активных внешних подключений к СУБД в течение всего процесса обновления.

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

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

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

  5. В случае кластерной конфигурации, обновите строку подключения к СУБД (проверьте значение портов) и убедитесь, что в строке указаны оба узла кластера (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

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

Шаг 1. Резервное копирование

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

    • (master, replica, arbiter) general:

      mkdir -p ~/pangolin/cache/backup/pangolin_general/{postgres,kmadmin_pg}
      sudo cp -ra /usr/local/sbin/dynmotd.sh ~/pangolin/cache/backup/pangolin_general/
      sudo cp -ra /etc/profile ~/pangolin/cache/backup/pangolin_general/
      sudo cp -ra /home/postgres/.bash_profile ~/pangolin/cache/backup/pangolin_general/postgres
      sudo cp -ra /home/postgres/.bashrc ~/pangolin/cache/backup/pangolin_general/postgres
      sudo cp -ra /home/kmadmin_pg/.bash_profile ~/pangolin/cache/backup/pangolin_general/kmadmin_pg
      sudo cp -ra /home/kmadmin_pg/.bashrc ~/pangolin/cache/backup/pangolin_general/kmadmin_pg
    • (master, replica, arbiter) pangolin-auth-reencrypt:

      mkdir -p ~/pangolin/cache/backup/pangolin_auth_reencrypt
      sudo cp -ra {path_to_service}/pangolin_reencrypt@.service ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /opt/pangolin-common/bin/pg_auth_reencrypt ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/postgres/enc_util.cfg ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/postgres/enc_params.cfg.kmadmin_pg ~/pangolin/cache/backup/pangolin_auth_reencrypt/
      sudo cp -ra /etc/postgres/enc_params.cfg.postgres ~/pangolin/cache/backup/pangolin_auth_reencrypt/
    • (master, replica, arbiter) pangolin-certs-rotate:

      mkdir -p ~/pangolin/cache/backup/pangolin_certs_rotate
      sudo cp -ra {path_to_service}/pg_certs_rotate_agent.service ~/pangolin/cache/backup/pangolin_certs_rotate/
      sudo cp -ra /opt/pangolin-common/bin/pg_certs_rotate_agent ~/pangolin/cache/backup/pangolin_certs_rotate/
      sudo cp -ra /etc/postgres/pg_certs_rotate_agent.yml ~/pangolin/cache/backup/pangolin_certs_rotate/
    • (master, replica, arbiter) pangolin-security-utilities:

      mkdir -p ~/pangolin/cache/backup/pangolin_security_utilities
      sudo cp -ra /etc/postgres/enc_connection_settings_cert.cfg ~/pangolin/cache/backup/pangolin_security_utilities/
      sudo cp -ra /etc/postgres/enc_connection_settings.cfg ~/pangolin/cache/backup/pangolin_security_utilities/
    • (master, replica) pangolin-backup-tools:

      mkdir -p ~/pangolin/cache/backup/pangolin_backup_tools
      sudo cp -ra /opt/omni/lbin/* ~/pangolin/cache/backup/pangolin_backup_tools/
    • (master, replica) Pangolin Pooler:

      mkdir -p ~/pangolin/cache/backup/pangolin_pooler
      sudo cp -ra {path_to_service}/pgbouncer.service ~/pangolin/cache/backup/pangolin_pooler/
      sudo cp -ra /usr/local/bin/pgbouncer ~/pangolin/cache/backup/pangolin_pooler/
      sudo cp -ra /etc/pgbouncer/pgbouncer.ini ~/pangolin/cache/backup/pangolin_pooler/
      sudo cp -ra /etc/pgbouncer/userlist.txt ~/pangolin/cache/backup/pangolin_pooler/
      sudo cp -ra /usr/local/share/man/man1/pgbouncer.1 ~/pangolin/cache/backup/pangolin_pooler/
      sudo cp -ra /usr/local/share/man/man5/pgbouncer.5 ~/pangolin/cache/backup/pangolin_pooler/
    • (master, replica, arbiter) Pangolin Manager:

      export PGDATA=/pgdata/xx
      mkdir -p ~/pangolin/cache/backup/pangolin_manager
      sudo cp -ra {path_to_service}/patroni.service ~/pangolin/cache/backup/pangolin_manager/
      sudo cp -ra /etc/patroni/postgres.yml ~/pangolin/cache/backup/pangolin_manager/
      sudo cp -ra /etc/patroni/reload_pgbouncer.sh ~/pangolin/cache/backup/pangolin_manager/
      sudo cp -ra /usr/patroni ~/pangolin/cache/backup/pangolin_manager/
    • (master, replica) pangolin-dbms:

      export PANGOLIN_FULL_VER_OLD=x.x.x
      export PANGOLIN_VER_OLD=x.x.x
      export PGDATA=/pgdata/xx
      export PGHOME=/usr/pangolin-x.x.x
      mkdir -p ~/pangolin/cache/backup/pangolin_dbms
      sudo cp -ra {path_to_service}/postgresql.service ~/pangolin/cache/backup/pangolin_dbms/ # для конфигурации без Pangolin Manager
      sudo cp -ra /etc/postgres/enc_utils_auth_settings.cfg ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra $PGHOME/ ~/pangolin/cache/backup/pangolin_dbms/
      sudo dnf download --downloadonly --destdir=~/pangolin/cache/backup/pangolin_dbms/ platform-v-pangolin-dbms-$PANGOLIN_FULL_VER_OLD
    • (master, replica) pangolin-timescaledb:

      export PANGOLIN_VER_OLD=x.x.x
      export PANGOLIN_TIMESCALEDB_OLD=x.x.x
      mkdir -p ~/pangolin/cache/backup/pangolin_timescaledb
      sudo dnf download --downloadonly --destdir=~/pangolin/cache/backup/pangolin_timescaledb/ pangolin-timescaledb-$PANGOLIN_TIMESCALEDB_OLD.$PANGOLIN_VER_OLD

    Где path_to_service - актуальный путь до service-файла компонента. В случае наличия функциональности «Отказ от root» это может быть путь /home/postgres/.config/systemd/user/. В случае отсутствия такой функциональности это может быть /usr/lib/systemd/system/, /lib/systemd/system/ или /etc/systemd/system/.

  2. (master) Добавьте запись host replication postgres 127.0.0.1/32 scram-sha-256 первой строкой в файл $PGDATA/data/pg_hba.conf или в файл /etc/patroni/postgres.yml в секцию pg_hba для конфигурации с Pangolin Manager для корректного выполнения резервной копии БД.

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

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

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

      sudo -iu postgres
      export CLUSTERNAME=clustername
      /usr/patroni/patroni_venv/bin/patronictl -c /etc/patroni/postgres.yml reload $CLUSTERNAME
      exit
    Ошибка «This system supports the C.UTF-8 locale which is recommended»

    Если при вызове утилиты возникает ошибка в локалях кодировки: This system supports the C.UTF-8 locale which is recommended, добавьте следующее содержимое в конец файла ~/.bash_profile под пользователем postgres следующим содержимым при помощи текстового редактора:

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8
  4. (master) Создайте каталог для резервной копии:

    sudo mkdir -p /pgarclogs/cache/backup/pangolin_dbms
    sudo chmod -R 0700 /pgarclogs/cache/backup/pangolin_dbms
    sudo chown -R postgres:postgres /pgarclogs/cache/
  5. (master) Выполните резервное копирование:

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

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

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

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

      sudo -iu postgres
      export CLUSTERNAME=clustername
      /usr/patroni/patroni_venv/bin/patronictl -c /etc/patroni/postgres.yml reload $CLUSTERNAME
      exit

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

  1. (master) Сохраните исходные значения стенда для последующей инициализации новой БД:

    sudo -iu postgres
    export PGPASSWORD=<password_postgres>
    export PGHOME=/usr/pangolin-x.x.x
    $PGHOME/bin/psql -c "SHOW SERVER_ENCODING;" > current_value.txt
    $PGHOME/bin/psql -c "SHOW LC_COLLATE;" >> current_value.txt
    $PGHOME/bin/psql -c "SHOW LC_CTYPE;" >> current_value.txt
    $PGHOME/bin/psql -c "SHOW LC_MESSAGES;" >> current_value.txt
    $PGHOME/bin/psql -c "SHOW LC_MONETARY;" >> current_value.txt
    $PGHOME/bin/psql -c "SHOW LC_NUMERIC;" >> current_value.txt
    $PGHOME/bin/psql -c "SHOW LC_TIME;" >> current_value.txt
    $PGHOME/bin/psql -c "SELECT oid, pg_tablespace_location(oid) FROM pg_tablespace WHERE spcname not in ('pg_default', 'pg_global');" >> current_value.txt
    exit
  2. (master, replica) Сформируйте конфигурационные файлы для работы с новой версией:

    export PGDATA=/pgdata/xx
    mkdir -p ~/pangolin/cache/merge
    sudo cp $PGDATA/data/postgresql.conf ~/pangolin/cache/merge/postgresql.conf
    sudo cp $PGDATA/data/postgresql.base.conf ~/pangolin/cache/merge/postgresql.base.conf
    sudo cp $PGDATA/data/pg_hba.conf ~/pangolin/cache/merge/pg_hba.conf

    Пример редактируемых параметров:

    archive_command = '/opt/pangolin-backup-tools/bin/pg_probackup archive-push -B $PGBACKUP_NEW --instance $CLUSTERNAME --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 4 --batch-size=100'
    pg_plugins_path = '$PGHOME_NEW/lib'
    hba_file = '$PGDATA_NEW/data/pg_hba.conf'
    ident_file = '$PGDATA_NEW/data/pg_ident.conf'
  3. (master) Подготовьте исходную базу для корректной миграции:

    1. Под пользователем postgres заполните файл ~/change_0.sql следующим содержимым при помощи текстового редактора:

      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));
    2. Под пользователем postgres заполните файл ~/change_1.sql следующим содержимым при помощи текстового редактора:

      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();
    3. Под пользователем postgres заполните файл ~/change_2.sql следующим содержимым при помощи текстового редактора:

      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;
    4. Под пользователем postgres заполните файл ~/run_precondition.sh следующим содержимым при помощи текстового редактора:

      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 ~/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 ~/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 ~/change_2.sql -1
      done
    5. Запустите скрипт с помощью команды:

      sudo -iu postgres
      export PGHOME_CLIENT=/usr/pangolin-x.x.x
      export PGPASSWORD=<password_postgres>
      chmod 0700 run_precondition.sh
      ./run_precondition.sh >> current_value.txt
      exit
  4. (master) Проверьте отсутствие большого количества транзакций с незавершенным статусом. Для этого выполните следующий запрос для каждой базы под пользователем postgres. <DB> - заменить на название базы данных:

    sudo -iu postgres
    export PGHOME_CLIENT=/usr/pangolin-x.x.x
    $PGHOME_CLIENT/bin/psql -d <DB> -c "WITH data_dir AS (SELECT setting AS path FROM pg_settings WHERE name = 'data_directory'), files AS (SELECT pg_ls_dir(path || '/pg_xact') AS fname FROM data_dir), count AS (SELECT count(*) AS file_count FROM files) SELECT current_database() AS dbname, (file_count > 3) AS clog_too_large FROM count;"
    exit

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

  5. (master) Выполните проверку состояния близости БД к пороговому значению заморозки транзакций autovacuum_freeze_max_age. Для этого выполните следующий запрос для каждой базы под пользователем postgres. <DB> - заменить на название базы данных:

    sudo -iu postgres
    export PGHOME_CLIENT=/usr/pangolin-x.x.x
    $PGHOME_CLIENT/bin/psql -d <DB> -c "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;"
    exit
    Результат выполнения запроса

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

    • 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% .
  6. (master, replica, arbiter) Скачайте дистрибутив в рабочий каталог и распакуйте его. Далее по инструкции путь к компонентам дистрибутива будет формироваться по ~/pangolin:

    mkdir -p ~/pangolin
    tar -xzvf pangolin.tar.gz -C ~/pangolin

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

Внимание!

Перед остановкой необходимо выполнить командуCHECKPOINT на мастере.

  1. (master) В случае конфигурации с Pangolin Manager введите компонент в режим паузы:

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

    • Для конфигурации с Pangolin Manager и модулем Pangolin DCS:

      • на мастере и реплике:

        sudo systemctl stop pgbouncer
        sudo systemctl stop pg_certs_rotate_agent
        sudo systemctl stop pangolin_reencrypt@postgres
        sudo systemctl stop pangolin_reencrypt@kmadmin_pg
        sudo systemctl stop patroni
        sudo -iu postgres
        export PGHOME=/usr/pangolin-x.x.x
        export PGDATA=/pgdata/xx
        $PGHOME/bin/pg_ctl stop -D $PGDATA/data
        exit
      • на арбитре:

        sudo systemctl stop pg_certs_rotate_agent
        sudo systemctl stop pangolin_reencrypt@postgres
        sudo systemctl stop pangolin_reencrypt@kmadmin_pg
        sudo systemctl stop patroni
    • Для конфигурации с Pangolin Manager и etcd:

      • на мастере и реплике:

        sudo systemctl stop pgbouncer
        sudo systemctl stop pg_certs_rotate_agent
        sudo systemctl stop pangolin_reencrypt@postgres
        sudo systemctl stop pangolin_reencrypt@kmadmin_pg
        sudo systemctl stop patroni
        sudo systemctl stop etcd
        sudo -iu postgres
        export PGHOME=/usr/pangolin-x.x.x
        export PGDATA=/pgdata/xx
        $PGHOME/bin/pg_ctl stop -D $PGDATA/data
        exit
      • на арбитре:

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

      • на мастере:

        sudo systemctl stop pgbouncer
        sudo systemctl stop pg_certs_rotate_agent
        sudo systemctl stop pangolin_reencrypt@postgres
        sudo systemctl stop pangolin_reencrypt@kmadmin_pg
        # в случае наличия файла `postgresql.service`:
        sudo systemctl stop postgresql
        # в случае отсутствия файла `postgresql.service`:
        sudo -iu postgres
        export PGHOME=/usr/pangolin-x.x.x
        export PGDATA=/pgdata/xx
        $PGHOME/bin/pg_ctl stop -D $PGDATA/data
        exit
  3. (master, replica, arbiter) Проверьте, что все компоненты корректно остановлены:

    sudo ps aux | grep -E "pgbouncer|patroni|postgresql|pg_certs_rotate_agent|pg_auth_reencrypt|etcd" | grep -v grep

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

    sudo kill -9 <pid>
    sudo ps aux | grep -E "pgbouncer|patroni|postgresql|pg_certs_rotate_agent|pg_auth_reencrypt|etcd" | grep -v grep

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

  1. (master, replica) Произведите обновление пакета компонента:

    export PANGOLIN_VER=x.x.x
    sudo dnf install -y ~/pangolin/utilities/pangolin-auth-reencrypt-$PANGOLIN_VER-sberlinux8.x86_64.rpm
  2. (master, replica) С помощью текстового редактора произведите замену старых значений $PGDATA, $PGHOME, $PGHOME_CLIENT на новые $PGDATA_NEW, $PGHOME_NEW, $PGHOME_CLIENT_NEW в service-файле компонента path_to_service.

    Где path_to_service - актуальный путь до service-файла pangolin-auth-reencrypt.service компонента. В случае наличия функциональности «Отказ от root» это может быть путь /home/postgres/.config/systemd/user/. В случае отсутствия такой функциональности это может быть /usr/lib/systemd/system/, /lib/systemd/system/ или /etc/systemd/system/.

Внимание!

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

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

  1. (master, replica) Произведите обновление пакета компонента:

    export PANGOLIN_VER=x.x.x
    sudo dnf install -y ~/pangolin/utilities/pangolin-certs-rotate-$PANGOLIN_VER-sberlinux8.x86_64.rpm
  2. (master, replica) С помощью текстового редактора произведите замену старых значений $PGDATA, $PGHOME, $PGHOME_CLIENT на новые $PGDATA_NEW, $PGHOME_NEW, $PGHOME_CLIENT_NEW в service-файле компонента path_to_service.

    Где path_to_service - актуальный путь до service-файла pangolin-certs-rotate.service компонента. В случае наличия функциональности «Отказ от root» это может быть путь /home/postgres/.config/systemd/user/. В случае отсутствия такой функциональности это может быть /usr/lib/systemd/system/, /lib/systemd/system/ или /etc/systemd/system/.

Внимание!

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

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

  1. (master, replica) Произведите обновление пакета компонента:

    export PANGOLIN_VER=x.x.x
    sudo dnf install -y ~/pangolin/utilities/pangolin-security-utilities-$PANGOLIN_VER-sberlinux8.x86_64.rpm
    Внимание!

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

  2. (master, replica) Произведите проверку файла secret_dump_key.bin на стенде:

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

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

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

    1. С помощью утилиты pg_dump_generate_secret_file создайте файл для хранения ключа засекречивания:

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

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

(master, replica) Произведите обновление пакета компонента:

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

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

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

    tar -xzf ~/pangolin/3rdparty/3rdparty.tar.gz -C ~/pangolin/3rdparty/
    export PANGOLIN_BACKUP_TOOLS_VENV=x.x.x
    sudo dnf install -y ~/pangolin/3rdparty/pangolin-backup-tools-venv/pangolin-backup-tools-venv-$PANGOLIN_BACKUP_TOOLS_VENV-sberlinux8.x86_64.rpm
  2. (master, replica) Произведите обновление компонента:

    export PANGOLIN_BACKUP_TOOLS=x.x.x
    sudo dnf install -y ~/pangolin/pangolin-backup-tools-$PANGOLIN_BACKUP_TOOLS-sberlinux8.x86_64.rpm
  3. (master, replica) Актуализируйте конфигурационный файл /etc/pangolin-backup-tools/backup-tools-env согласно шаблону ниже:

    # PATH, used for access to required executable files, default value: "${PATH}:{PGHOME}/bin/"
    PATH="${PATH}:$PGHOME_NEW/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="$PGBACKUP_NEW"
    # 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"
    # to checkpoint before backup DB
    PG_FAST_CHECKPOINT=False

    # 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
    export PG_FAST_CHECKPOINT

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

(master, replica) Произведите обновление пакета компонента:

export PANGOLIN_POOLER=x.x.x
sudo dnf install -y ~/pangolin/pangolin-pooler-$PANGOLIN_POOLER-sberlinux8.x86_64.rpm

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

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

    tar -xzf ~/pangolin/3rdparty/3rdparty.tar.gz -C ~/pangolin/3rdparty/
    export PANGOLIN_MANAGER_VENV=x.x.x
    sudo dnf install -y ~/pangolin/3rdparty/pangolin-manager-venv/pangolin-manager-venv-$PANGOLIN_MANAGER_VENV-sberlinux8.x86_64.rpm
  2. (master, replica) Произведите обновление компонента:

    export PANGOLIN_MANAGER=x.x.x
    sudo dnf install -y ~/pangolin/pangolin-manager-$PANGOLIN_MANAGER-sberlinux8.x86_64.rpm
  3. (master, replica) С помощью текстового редактора произведите замену старых значений $PGDATA, $PGHOME, $PGHOME_CLIENT на новые $PGDATA_NEW, $PGHOME_NEW, $PGHOME_CLIENT_NEW в service-файле компонента path_to_service.

    Где path_to_service - актуальный путь до service-файла pangolin-manager.service компонента. В случае наличия функциональности «Отказ от root» это может быть путь /home/postgres/.config/systemd/user/. В случае отсутствия такой функциональности это может быть /usr/lib/systemd/system/, /lib/systemd/system/ или /etc/systemd/system/.

  4. (master, replica) Перенаправьте вспомогательную символьную ссылку для корректной работы компонента:

    export PGHOME_NEW=/usr/pangolin-x.x
    sudo ln -sfvn $PGHOME_NEW /opt/pangolin-dbms
Внимание!

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

Шаг 10. Обновление компонента серверной части СУБД Pangolin

  1. (master, replica) Произведите обновление пакета компонента:

    export PANGOLIN_VER=x.x.x
    export PANGOLIN_DBMS_MAJOR=x
    export PANGOLIN_DBMS_MINOR=x
    sudo dnf install -y ~/pangolin/pangolin-dbms-$PANGOLIN_DBMS_MAJOR.$PANGOLIN_DBMS_MINOR-$PANGOLIN_VER-sberlinux8.x86_64.rpm
  2. (master, replica) С помощью текстового редактора произведите замену старых значений $PGDATA, $PGHOME, $PGHOME_CLIENT на новые $PGDATA_NEW, $PGHOME_NEW, $PGHOME_CLIENT_NEW в service-файле компонента path_to_service.

    Где path_to_service - актуальный путь до service-файла postgresql.service компонента. В случае наличия функциональности «Отказ от root» это может быть путь /home/postgres/.config/systemd/user/. В случае отсутствия такой функциональности это может быть /usr/lib/systemd/system/, /lib/systemd/system/ или /etc/systemd/system/.

Шаг 11. Обновление компонента клиентской части СУБД Pangolin

(master, replica) Произведите обновление пакета компонента:

export PANGOLIN_VER=x.x.x
export PANGOLIN_DBMS_MAJOR=x
export PANGOLIN_DBMS_MINOR=x
sudo dnf install -y ~/pangolin/pangolin-dbms-$PANGOLIN_DBMS_MAJOR.$PANGOLIN_DBMS_MINOR-client-$PANGOLIN_VER-sberlinux8.x86_64.rpm

Шаг 12. Обновление пакета расширения pangolin-timescaledb

(master, replica) Произведите обновление пакета расширения:

export PANGOLIN_TIMESCALEDB=x.x.x
export PANGOLIN_TIMESCALEDB_RELEASE=x.x.x
export PANGOLIN_DBMS_MAJOR=x
export PANGOLIN_DBMS_MINOR=x
sudo dnf install -y ~/pangolin/timescaledb/pangolin-timescaledb-$PANGOLIN_DBMS_MAJOR.$PANGOLIN_DBMS_MINOR-apache-$PANGOLIN_TIMESCALEDB-$PANGOLIN_TIMESCALEDB_RELEASE.sberlinux8-x86_64.rpm

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

(master, replica) Произведите обновление пакета компонента:

export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/utilities/pangolin-auth-password-$PANGOLIN_VER-sberlinux8.x86_64.rpm

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

(master, replica) Произведите обновление пакета компонента:

export PANGOLIN_TUNER=x.x.x
sudo dnf install -y ~/pangolin/utilities/pangolin-tuner-$PANGOLIN_TUNER-sberlinux8.x86_64.rpm

Шаг 15. Обновление опциональных пакетов

(master, replica) Произведите обновление опциональных пакетов:

export PANGOLIN_DBMS_MAJOR=x
export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/pangolin-dbms-$PANGOLIN_DBMS_MAJOR-libpq-$PANGOLIN_VER-sberlinux8.x86_64.rpm
sudo dnf install -y ~/pangolin/pangolin-dbms-$PANGOLIN_DBMS_MAJOR-libpq-dev-$PANGOLIN_VER-sberlinux8.x86_64.rpm

Шаг 16. Обновление пакетов pangolin-untrusted расширений

Внимание!

Выполните данный шаг, если в СУБД используются untrusted-расширения. Список данных расширений и подробную информацию о них можно прочитать в разделе«Информация по Untrusted-расширениям».

  1. (master, replica) Распакуйте архив, содержащий untrusted-расширения:

    tar -xzf ~/pangolin/untrusted/untrusted.tar.gz -C ~/pangolin/untrusted/
  2. (master, replica) Произведите обновление пакетов расширений:

    export PANGOLIN_VER=x.x.x
    export PANGOLIN_DBMS_MAJOR=x
    sudo dnf install -y ~/pangolin/untrusted/pangolin-dbms-$PANGOLIN_DBMS_MAJOR-<ext_name>-$PANGOLIN_VER-sberlinux8.x86_64.rpm

    Где ext_name - название untrusted-расширения.

Шаг 17. Обновление пакетов сторонних расширений

Внимание!

Только для обновления с версий 6.6.0 и выше. Выполните данный шаг, если в СУБД используются сторонние расширения. Список данных расширений и подробную информацию о них можно прочитать в разделеpostgis. Поддержка геоданных и pg_background. Запуск команд в фоновом режиме.

  1. (master, replica) Произведите обновление пакетов сторонних расширений:

    export PANGOLIN_POSTGIS=x.x.x
    export PANGOLIN_PGROUTING=x.x.x
    export PANGOLIN_PG_BACKGROUND=x.x
    export PANGOLIN_POSTGIS_RELEASE=x.x.x
    export PANGOLIN_PGROUTING_RELEASE=x.x.x
    export PANGOLIN_PG_BACKGROUND_RELEASE=x.x.x
    export PANGOLIN_DBMS_MAJOR=x
    sudo dnf install -y ~/pangolin/3rdparty/postgis/pangolin-postgis-$PANGOLIN_DBMS_MAJOR-$PANGOLIN_POSTGIS-$PANGOLIN_POSTGIS_RELEASE.sberlinux8.x86_64.rpm
    sudo dnf install -y ~/pangolin/3rdparty/pgrouting/pangolin-pgrouting-$PANGOLIN_DBMS_MAJOR-$PANGOLIN_PGROUTING.sberlinux8.x86_64.rpm
    sudo dnf install -y ~/pangolin/3rdparty/pg_background/pangolin-pg-background-$PANGOLIN_DBMS_MAJOR-$PANGOLIN_PG_BACKGROUND.sberlinux8.x86_64.rpm
  2. (master, replica) Актуализируйте путь в конфигурационном файле к динамическим библиотекам для корректной работы сторонних расширений. dynamic_library_path должен содержать обязательное значение /opt/pangolin-extensions/{base_version}/lib в первом приоритете. При необходимости, добавить через знак : исходные значения параметра. Пример:

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

      dynamic_library_path = '/opt/pangolin-extensions/{base_version}/lib:/opt/pangolin-extensions/{pangolin_major_old_version}/lib:$libdir'
    • Для конфигурации c Pangolin Manager. Отредактируйте конфигурационный файл ~/pangolin/cache/merge/postgres.yml:

      postgresql:
      parameters:
      dynamic_library_path: "/opt/pangolin-extensions/{base_version}/lib:/opt/pangolin-extensions/{pangolin_major_old_version}/lib:$libdir"

    Где:

    • {pangolin_major_old_version} - исходная мажорная версия СУБД Pangolin (формат - );
    • {base_version} – базовая версия продукта (текущая: 6).
  3. Добавьте в конфигурационном файле параметр alternative_extension_control_directory с путем до .control файлов для корректной работы сторонних расширений. Пример:

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

      alternative_extension_control_directory = '/opt/pangolin-extensions/{base_version}/lib,/opt/pangolin-extensions/{pangolin_major_old_version}/share/extension'
    • Для конфигурации c Pangolin Manager. Отредактируйте конфигурационный файл ~/pangolin/cache/merge/postgres.yml:

      postgresql:
      parameters:
      alternative_extension_control_directory: "/opt/pangolin-extensions/{base_version}/lib,/opt/pangolin-extensions/{pangolin_major_old_version}/share/extension"

    Где:

    • {pangolin_major_old_version} - исходная мажорная версия СУБД Pangolin (формат - );
    • {base_version} – базовая версия продукта (текущая: 6).

Шаг 18. Подготовка к миграции данных

  1. (master, replica, arbiter) Создайте директории и рабочие поддиректории $PGDATA_NEW/data, $PGBACKUP_NEW, а также каталоги для работы утилиты pg_upgrade:

    export PGDATA_NEW=/pgdata/xx
    export PGBACKUP_NEW=/pgarclogs/xx
    sudo mkdir -p $PGDATA_NEW/{data,raft_data,raft_dump,raft} $PGBACKUP_NEW /pgarclogs/pg_upgrade /var/run/postgresql/pg_upgrade
    sudo chown -R postgres:postgres $PGDATA_NEW $PGBACKUP_NEW /pgarclogs/pg_upgrade /var/run/postgresql
    sudo chmod -R 0700 $PGDATA_NEW $PGBACKUP_NEW /pgarclogs/pg_upgrade /var/run/postgresql
  2. (master) Инициализируйте новый кластер СУБД Pangolin:

    export PANGOLIN_VER=x.x.x
    sudo tar -xz -f ~/pangolin/3rdparty/3rdparty.tar.gz -C ~/pangolin/3rdparty/
    sudo dnf install -y ~/pangolin/3rdparty/pangolin-ansible-venv-controlled-$PANGOLIN_VER-sberlinux8.x86_64.rpm
    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
    unset LD_LIBRARY_PATH
    unset PG_PLUGINS_PATH
    export PGDATA_NEW=/pgdata/xx
    export PGHOME_NEW=/usr/pangolin-x.x
    $PGHOME_NEW/bin/initdb -D $PGDATA_NEW/data -k -A scram-sha-256 --pwfile ~/.tmp_file -E UTF8 --update-authid --lc-collate <locele from current_value.txt> --lc-ctype <locele from current_value.txt> --lc-messages <locele from current_value.txt> --lc-monetary <locele from current_value.txt> --lc-numeric <locele from current_value.txt> --lc-time <locele from current_value.txt>
    exit

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

    /usr/pangolin/bin/initdb -D /pgdata/06/data -k -A scram-sha-256 --pwfile ~/.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) Переместите предварительно подготовленные конфигурационные файлы каталога в рабочую директорию:

    export PGDATA_NEW=/pgdata/xx
    sudo cp -rf ~/pangolin/cache/merge/postgresql.conf $PGDATA_NEW/data/postgresql.conf
    sudo cp -rf ~/pangolin/cache/merge/postgresql.base.conf $PGDATA_NEW/data/postgresql.base.conf
    sudo cp -rf ~/pangolin/cache/merge/pg_hba.conf $PGDATA_NEW/data/pg_hba.conf
    sudo chown postgres:postgres $PGDATA_NEW/data/*.conf
    sudo chmod 0700 $PGDATA_NEW/data/*.conf

    (master, replica) Дополнительно для конфигурации с Pangolin Manager:

    export PGDATA_NEW=/pgdata/xx
    sudo cp -rf ~/pangolin/cache/merge/postgres.yml /etc/pangolin-manager/postgres.yml
    sudo cp -rf ~/pangolin/cache/merge/patroni.dynamic.json $PGDATA_NEW/data/patroni.dynamic.json # выполнить действие только на узле мастер
    sudo chown postgres:postgres /etc/pangolin-manager/postgres.yml $PGDATA_NEW/data/patroni.dynamic.json
    sudo chmod 0600 /etc/pangolin-manager/postgres.yml $PGDATA_NEW/data/patroni.dynamic.json
  4. (master) Внесите следующие корректировки в конфигурационные файлы СУБД для миграции с комментарием tmp_line:

    export PGDATA=/pgdata/xx
    export PGDATA_NEW=/pgdata/xx
    sudo sed -i '1ilocal all postgres scram-sha-256 #tmp_line' $PGDATA/data/pg_hba.conf
    sudo sed -i '1ilocal all postgres scram-sha-256 #tmp_line' $PGDATA_NEW/data/pg_hba.conf
    sudo sed -i -e "\$aautovacuum = 'off' #tmp_line" $PGDATA/data/postgresql.conf
    sudo sed -i -e "\$asynchronous_commit = 'off' #tmp_line" $PGDATA/data/postgresql.conf
    sudo sed -i -e "\$acron.database_name = 'template1' #tmp_line" $PGDATA/data/postgresql.conf
    sudo sed -i -e "\$aautovacuum = 'off' #tmp_line" $PGDATA_NEW/data/postgresql.conf
    sudo sed -i -e "\$asynchronous_commit = 'off' #tmp_line" $PGDATA_NEW/data/postgresql.conf
    sudo sed -i -e "\$acron.database_name = 'template1' #tmp_line" $PGDATA_NEW/data/postgresql.conf

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

(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

Шаг 20. Миграция данных с помощью утилиты pg_upgrade

(master) Запустите миграцию данных с помощью pg_upgrade:

sudo -iu postgres
unset LD_LIBRARY_PATH
unset PG_PLUGINS_PATH
export PGPORT=<port DBMS>
export PGHOST=127.0.0.1
export PGHOME=/usr/pangolin-x.x.x
export PGHOME_NEW=/usr/pangolin-x.x
export PGHOME_CLIENT=/usr/pangolin-x.x.x
export PGHOME_CLIENT_NEW=/usr/pangolin-dbms-client-x.x
export PGPASSWORD=<password_postgres>
export PGDATA=/pgdata/xx
export PGDATA_NEW=/pgdata/xx
$PGHOME_NEW/bin/pg_upgrade -b $PGHOME/bin -B $PGHOME_NEW/bin --old-bindirclient $PGHOME_CLIENT/bin --new-bindirclient $PGHOME_CLIENT_NEW/bin -d $PGDATA/data -D $PGDATA_NEW/data -p $PGPORT -P 50433 -j 2 --socketdir=/var/run/postgresql/pg_upgrade -l /pgarclogs/pg_upgrade --link -r
exit
Внимание!

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

Ошибка «ERROR: duplicate key value violates unique constraint 'pg_proc_oid_index'»

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

pg_restore: error: could not execute query: ERROR: duplicate key value violates unique constraint "pg_proc_oid_index"
DETAIL: Key (oid)=(17932) already exists.

Добавьте к вызову pg_upgrade параметр --two-phases-extensions=fuzzystrmatch,postgis,postgis_raster,postgis_sfcgal,postgis_topology,postgis_tiger_geocoder,address_standardizer,address_standardizer_data_us,pgrouting,isn

Если параметр --two-phases-extensions уже используется, добавьте в передаваемый список расширение isn.

Ошибка «ERROR: This module can only be loaded via shared_preload_libraries»

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

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, который находится в $PGDATA_NEW/data/postgresql.conf, в правильном порядке, как в примере ниже:

export PGDATA_NEW=/pgdata/xx
sudo sed -i "s/#shared_preload_libraries = ''/shared_preload_libraries = 'pg_stat_statements,pg_stat_kcache'/g" $PGDATA_NEW/data/postgresql.conf

Шаг 21. Актуализация путей до табличных пространств

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

export PGDATA=/pgdata/xx
export PGDATA_NEW=/pgdata/xx
sudo rm -rf $PGDATA/tablespaces/<TS>/PG_13_XXXXXXXXX
sudo cp -ra $PGDATA/tablespaces $PGDATA_NEW/tablespaces

sudo -iu postgres
export PGDATA_NEW=/pgdata/xx
ln -sfn <path> $PGDATA_NEW/data/pg_tblspc/<oid>
exit

Где, значения для <path> и <oid> необходимо заменить на значения oid и pg_tablespace_location из файла ~/current_value.txt в домашнем каталоге пользователя postgres соответственно. В параметре <path> перед выполнением команды заменить значение $PGDATA на значение $PGDATA_NEW.

Пример команды:

sudo  -iu postgres
ln -sfn /pgdata/06/tablespaces/Tbl_t /pgdata/06/data/pg_tblspc/16739
exit

Шаг 22. Перенос данных с помощью rsync на реплику

Внимание!

Выполните данный шаг, если конфигурация с Pangolin Manager, иначе данный шаг пропустите и переходите кшагу 22.

  1. (replica) Сгенерируйте ключ доступа для переноса данных с мастера на реплику:

    sudo -iu postgres
    mkdir -p /pgarclogs/cache/rsync
    ssh-keygen
    exit
    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-ключа с реплики на мастер:

    sudo -iu postgres
    mkdir ~/.ssh && chmod 700 ~/.ssh
    ssh-copy-id -i /pgarclogs/cache/rsync/ssh_key_rsync postgres@<ip-address_master>
    exit
  2. (replica) Запустите rsync для переноса данных /pgdata:

    sudo -iu postgres
    export PGDATA_NEW=/pgdata/xx
    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_NEW /pgdata
    exit
  3. (replica) Если есть табличные пространства, находящиеся в не /pgdata, их необходимо аналогично перенести:

    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/xx/tablespaces/tsin /pgdata/xx/tablespaces

Шаг 23. Индексирование и очистка устаревших записей

  1. (master) Запустите экземпляр СУБД на мастере:

    sudo -iu postgres
    export PGHOME_NEW=/usr/pangolin-x.x
    export PGDATA_NEW=/pgdata/xx
    unset LD_LIBRARY_PATH
    unset PG_PLUGINS_PATH
    $PGHOME_NEW/bin/pg_ctl start -D $PGDATA_NEW/data
    exit
  2. (master) Проиндексируйте данные в БД:

    sudo -iu postgres
    export PGPASSWORD=<password_postgres>
    export PGHOME_CLIENT_NEW=/usr/pangolin-dbms-client-x.x
    export PGHOST=127.0.0.1
    export PGDATA_NEW=/pgdata/xx
    export PGDATA=$PGDATA_NEW
    unset LD_LIBRARY_PATH
    unset PG_PLUGINS_PATH
    $PGHOME_CLIENT_NEW/bin/reindexdb -j 2 --all
    $PGHOME_CLIENT_NEW/bin/vacuumdb -j 2 --analyze-in-stages --all
    exit

    В случае наличия файла /pgarclogs/pg_upgrade/reindex_gin.sql выполните следующую команду:

    sudo -iu postgres
    export PGPASSWORD=<password_postgres>
    export PGHOME_NEW=/usr/pangolin-x.x
    unset LD_LIBRARY_PATH
    unset PG_PLUGINS_PATH
    $PGHOME_NEW/bin/psql < /pgarclogs/pg_upgrade/reindex_gin.sql
    exit
  3. (master) Остановите экземпляр СУБД на мастере:

    sudo -iu postgres
    export PGHOME_NEW=/usr/pangolin-x.x
    export PGDATA_NEW=/pgdata/xx
    $PGHOME_NEW/bin/pg_ctl stop -D $PGDATA_NEW/data
    exit

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

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

    • Для конфигурации с Pangolin Manager и модулем Pangolin DCS:

      • на мастере и реплике:

        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
        sudo systemctl restart pangolin-manager
      • на арбитре:

        sudo systemctl daemon-reload
        sudo systemctl restart pangolin-certs-rotate
        sudo systemctl restart pangolin-auth-reencrypt@postgres
        sudo systemctl restart pangolin-auth-reencrypt@kmadmin_pg
        sudo systemctl restart pangolin-manager
    • Для конфигурации с Pangolin Manager и etcd:

      • на мастере и реплике:

        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
        sudo systemctl restart pangolin-manager
        sudo systemctl restart etcd
      • на арбитре:

        sudo systemctl daemon-reload
        sudo systemctl restart etcd
    • Для конфигурации без Pangolin Manager:

      • на мастере:

        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
        # в случае наличия файла `postgresql.service`:
        sudo systemctl restart postgresql
        # в случае отсутствия файла `postgresql.service`:
        sudo -iu postgres
        export PGDATA_NEW=/pgdata/xx
        export PGHOME_NEW=/usr/pangolin-x.x
        $PGHOME_NEW/bin/pg_ctl restart -D $PGDATA_NEW/data
        exit
  2. (master, replica, arbiter) Произведите проверку состояния служб:

    • Для конфигурации с Pangolin Manager и модулем Pangolin DCS:

      • на мастере и реплике:

        sudo systemctl status pangolin-pooler
        sudo systemctl status pangolin-certs-rotate
        sudo systemctl status pangolin-auth-reencrypt@postgres
        sudo systemctl status pangolin-auth-reencrypt@kmadmin_pg
        sudo systemctl status pangolin-manager
      • на арбитре:

        sudo systemctl status pangolin-certs-rotate
        sudo systemctl status pangolin-auth-reencrypt@postgres
        sudo systemctl status pangolin-auth-reencrypt@kmadmin_pg
        sudo systemctl status pangolin-manager
    • Для конфигурации с Pangolin Manager и etcd:

      • на мастере и реплике:

        sudo systemctl status pangolin-pooler
        sudo systemctl status pangolin-certs-rotate
        sudo systemctl status pangolin-auth-reencrypt@postgres
        sudo systemctl status pangolin-auth-reencrypt@kmadmin_pg
        sudo systemctl status pangolin-manager
        sudo systemctl status etcd
      • на арбитре:

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

      • на мастере:

        sudo systemctl status pangolin-pooler
        sudo systemctl status pangolin-certs-rotate
        sudo systemctl status pangolin-auth-reencrypt@postgres
        sudo systemctl status pangolin-auth-reencrypt@kmadmin_pg
        # в случае наличия файла `postgresql.service`:
        sudo systemctl status postgresql
        # в случае отсутствия файла `postgresql.service`:
        sudo -iu postgres
        export PGDATA_NEW=/pgdata/xx
        export PGHOME_NEW=/usr/pangolin-x.x
        $PGHOME_NEW/bin/pg_ctl status -D $PGDATA_NEW/data
        exit
  3. (master, replica, arbiter) Запустите сторонние сервисы:

    sudo systemctl restart crond

Шаг 25. Очистка кластера Pangolin Manager

Внимание!

Выполните данный шаг, если конфигурация с Pangolin Manager, иначе данный шаг пропустите и переходите кшагу 25.

  1. (master) Произведите очистку кластера:

    sudo -iu postgres
    export CLUSTERNAME=clustername
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml remove $CLUSTERNAME
    exit
  2. (master) Произведите restart компонента Pangolin Manager:

    • С включенной функциональностью «Отказ от root»:

      sudo -iu postgres
      systemctl --user restart pangolin-manager
      exit
    • Без функциональности «Отказ от root»:

      sudo systemctl restart pangolin-manager
  3. (master) Выведите Pangolin Manager из режима паузы:

    sudo -iu postgres
    export CLUSTERNAME=clustername
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart $CLUSTERNAME
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=false' --force
    exit
  4. (replica) Произведите restart компонента Pangolin Manager на реплике:

    • С включенной функциональностью «Отказ от root»:

      sudo -iu postgres
      systemctl --user restart pangolin-manager
      exit
    • Без функциональности «Отказ от root»:

      sudo systemctl restart pangolin-manager

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

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

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

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

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

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

      sudo -iu postgres
      export PGDATA_NEW=/pgdata/xx
      export PGHOME_NEW=/usr/pangolin-x.x
      $PGHOME_NEW/pg_ctl reload -D $PGDATA_NEW/data
      $PGHOME_NEW/pg_ctl restart -D $PGDATA_NEW/data
      exit
    • Для конфигурации c Pangolin Manager:

      sudo -iu postgres
      export PGDATA_NEW=/pgdata/xx
      export CLUSTERNAME=clustername
      /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 -iu postgres
    export PGHOME_NEW=/usr/pangolin-x.x
    $PGHOME_NEW/bin/psql -c "SELECT NOW();" -d <DB>
    exit
  4. (master) Удалите временный параметр enable_protection_catalogs_upgrade под пользователем postgres из конфигурационного файла (в зависимости от конфигурации) с помощью обычного текстового редактора:

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

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

      sudo -iu postgres
      export PGDATA_NEW=/pgdata/xx
      export PGHOME_NEW=/usr/pangolin-x.x
      $PGHOME_NEW/pg_ctl reload -D $PGDATA_NEW/data
      $PGHOME_NEW/pg_ctl restart -D $PGDATA_NEW/data
      exit
    • Для конфигурации c Pangolin Manager:

      sudo -iu postgres
      export PGDATA_NEW=/pgdata/xx
      export CLUSTERNAME=clustername
      /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

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

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

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

    export PGDATA_NEW=/pgdata/xx
    export PANGOLIN_VER_OLD=x.x.x
    export PGDATA=/pgdata/xx
    export PGBACKUP=/pgarclogs/xx
    export PANGOLIN_TIMESCALEDB_OLD=x.x.x
    sudo dnf remove -y platform-v-pangolin-dbms-$PANGOLIN_VER_OLD pangolin-timescaledb-$PANGOLIN_TIMESCALEDB_OLD.$PANGOLIN_VER_OLD
    sudo ln -sfvn $PGDATA_NEW /pgdata/data
    sudo rm -rf $PGDATA $PGBACKUP
  3. (master, replica, arbiter) Актуализируйте dynmotd.sh:

    export PANGOLIN_MANAGER=x.x.x
    export PANGOLIN_MANAGER_OLD=x.x.x
    export PANGOLIN_FULL_VER=0x.00x.0x
    export PANGOLIN_FULL_VER_OLD=0x.00x.0x

    sudo sed -i "s/$PANGOLIN_MANAGER_OLD/$PANGOLIN_MANAGER/g" /usr/local/sbin/dynmotd.sh
    sudo sed -i "s/$PANGOLIN_FULL_VER_OLD/$PANGOLIN_FULL_VER/g" /usr/local/sbin/dynmotd.sh
  4. (master, replica, arbiter) Актуализируйте .bash_profile для пользователя postgres:

    export PGHOME=/usr/pangolin-x.x.x
    export PGHOME_NEW="\/usr\/pangolin-x.x"
    export PGHOME_CLIENT_NEW="\/usr\/pangolin-dbms-client-x.x"
    export PGDATA="\/pgdata\/xx"
    export PGDATA_NEW="/pgdata/xx"
    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 "$ a export PGHOME_CLIENT=$PGHOME_CLIENT_NEW" /home/postgres/.bash_profile
    sudo sed -i "s/$PGHOME/$PGHOME_NEW/g" /home/postgres/.bash_profile
    sudo sed -i "s/$PGDATA/$PGDATA_NEW/g" /home/postgres/.bash_profile

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

    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
  5. (master) Произведите восстановление данных, измененных в шаге 2, после миграции:

    примечание

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

    Также необходимо проверить, какому пользователю были выданы права:

    • если строка имеет вид backup_user=X/postgres, то замените <user> на backup_user;
    • если строка имеет вид =X/postgres, то замените <user> на PUBLIC.
    1. Под пользователем postgres заполните файл ~/grant_opts_start.sql следующим содержимым при помощи текстового редактора:

      SET SESSION AUTHORIZATION <DB>;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start TO <user>;
      RESET SESSION AUTHORIZATION;
    2. Под пользователем postgres заполните файл ~/grant_opts_stop.sql следующим содержимым при помощи текстового редактора:

      SET SESSION AUTHORIZATION <DB>;
      GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop TO <user>;
      RESET SESSION AUTHORIZATION;
    3. Под пользователем postgres заполните файл ~/revoke_opts_start.sql следующим содержимым при помощи текстового редактора:

      REVOKE EXECUTE ON FUNCTION pg_catalog.pg_backup_start FROM <user>;
    4. Под пользователем postgres заполните файл ~/revoke_opts_stop.sql следующим содержимым при помощи текстового редактора:

      REVOKE EXECUTE ON FUNCTION pg_catalog.pg_backup_stop FROM <user>;
    5. Запустите скрипт с помощью команды:

      sudo -iu postgres
      export PGHOME_NEW=/usr/pangolin-x.x
      $PGHOME_NEW/bin/psql -f ~/grant_opts_start.sql
      $PGHOME_NEW/bin/psql -f ~/grant_opts_stop.sql
      $PGHOME_NEW/bin/psql -f ~/revoke_opts_start.sql
      $PGHOME_NEW/bin/psql -f ~/revoke_opts_stop.sql
      exit