Обновление кластера PostgreSQL 12 и ниже до версии 18

При обновлении PostgreSQL до основной версии используется утилита pg_upgrade. Она позволяет обновлять данные, хранящиеся в файлах данных PostgreSQL, до более поздней версии PostgreSQL.

Обновление кластера PostgreSQL состоит из нескольких этапов:

  1. Резервное копирование базы данных.
  2. Установка PostgreSQL 18.
  3. Обновление данных в каталоге базы данных.
  4. Запуск кластера Patroni.
  5. Проверка после установки.
  6. Очистка старых данных.

Шаг 1. Резервное копирование базы данных

Перед выполнением любых действий, связанных с обновлением, создайте резервную копию данных и конфигурации PostgreSQL. О том, как это сделать, читайте в статье «Резервное копирование и восстановление баз данных».

начало внимание

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

конец внимание

Резервное копирование базы данных PostgreSQL без использования утилиты elma365-backupper

Шаг 2. Установка PostgreSQL 18

Установите PostgreSQL 18 на все ноды кластера, в которых установлена версия 12 или ниже:

sudo apt install postgresql-18

Шаг 3. Обновление данных в каталоге базы данных

  1. В кластере PostrgeSQL определите Leader-ноду:

patronictl -c /etc/patroni/config.yml list

  1. На всех нодах кластера PostrgeSQL остановите Patroni:

sudo systemctl stop patroni.service

  1. На всех нодах кластера остановите PostgreSQL 12 или ниже и PostgreSQL 18:

sudo systemctl stop postgresql@12 postgresql@18

  1. Убедитесь, что кластеры PostgreSQL 12 или ниже и PostgreSQL 18 остановлены:

pg_lsclusters

  1. На Leader-ноде выполните проверку на предмет совместимости конфигураций баз данных:

sudo -iu postgres /usr/lib/postgresql/18/bin/pg_upgrade \
-o "-c config_file=/etc/postgresql/12/main/postgresql.conf"\
-O "-c config_file=/etc/postgresql/18/main/postgresql.conf" \
--old-datadir=/var/lib/postgresql/12/main/ \
--new-datadir=/var/lib/postgresql/18/main/ \
--old-bindir=/usr/lib/postgresql/12/bin \
--new-bindir=/usr/lib/postgresql/18/bin --check

где:

  • /usr/lib/postgresql/12/bin и /usr/lib/postgresql/18/bin пути к бинарным файлам PostgreSQL версий 12 и 18;
  • /var/lib/postgresql/12/main и /var/lib/postgresql/18/main пути к каталогам данных.
  1. На Leader-ноде выполните перенос данных из PostgreSQL 12 или ниже в PostgreSQL 18:

sudo -iu postgres /usr/lib/postgresql/18/bin/pg_upgrade \
-o "-c config_file=/etc/postgresql/12/main/postgresql.conf" \
-O "-c config_file=/etc/postgresql/18/main/postgresql.conf" \
--old-datadir=/var/lib/postgresql/12/main/ \
--new-datadir=/var/lib/postgresql/18/main/ \
--old-bindir=/usr/lib/postgresql/12/bin \
--new-bindir=/usr/lib/postgresql/18/bin

где:

  • /usr/lib/postgresql/12/bin и /usr/lib/postgresql/18/bin пути к бинарным файлам PostgreSQL версий 12 и 18;
  • /var/lib/postgresql/12/main и /var/lib/postgresql/18/main пути к каталогам данных.

Шаг 4. Запуск кластера Patroni

  1. На пути до PostgreSQL 18 откройте файл конфигурации Patroni:

sudo nano /etc/patroni/config.yml

  1. На каждой ноде кластера PostgreSQL замените параметры data_dir, bin_dir и config_dir, например:

...
data_dir: /var/lib/postgresql/18/main
bin_dir: /usr/lib/postgresql/18/bin
config_dir: /etc/postgresql/18/main
...

  1. Получите наименование кластера PostgreSQL 12 или ниже:

sudo cat /etc/patroni/config.yml | grep "scope" | awk '{ print $2 }'

  1. На Leader-ноде в Patroni удалите кластер PostgreSQL 12 или ниже:

patronictl -c /etc/patroni/config.yml remove postgres-cluster

где:

  • postgres-cluster наименование кластера PostgreSQL 12 или ниже, полученное на предыдущем этапе.
  1. На Leader-ноде запустите Patroni:

sudo systemctl start patroni.service

  1. На Replica-нодах удалите каталог данных PostgreSQL 18:

sudo rm -rf /var/lib/postgresql/18/main

  1. На Replica-нодах запустите Patroni:

sudo systemctl start patroni.service

Шаг 5. Проверка после установки

  1. Проверьте состояние кластера:

patronictl -c /etc/patroni/config.yml list

  1. Убедитесь, что PostgreSQL 18 работает корректно и данные доступны.
  2. Для оптимизации базы данных выполните команду на Leader-ноде:

sudo -u postgres /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages

Шаг 6. Очистка старых данных

начало внимание

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

конец внимание

При необходимости после успешного обновления и проверки PostgreSQL 18 вы можете очистить старые данные:

sudo -u postgres ./delete_old_cluster.sh