При обновлении PostgreSQL до основной версии используется утилита pg_upgrade. Она позволяет обновлять данные, хранящиеся в файлах данных PostgreSQL, до более поздней версии PostgreSQL.
Обновление кластера PostgreSQL состоит из нескольких этапов:
- Резервное копирование базы данных.
- Установка PostgreSQL 18.
- Обновление данных в каталоге базы данных.
- Запуск кластера Patroni.
- Проверка после установки.
- Очистка старых данных.
Шаг 1. Резервное копирование базы данных
Перед выполнением любых действий, связанных с обновлением, создайте резервную копию данных и конфигурации PostgreSQL. О том, как это сделать, читайте в статье «Резервное копирование и восстановление баз данных».
начало внимание
Если на сервере PostgreSQL имеются сторонние базы данных, их резервные копии также необходимо создать.
конец внимание
Резервное копирование базы данных PostgreSQL без использования утилиты elma365-backupper
Вы можете создать резервную копию базы данных sudo -u postgres pg_dump elma365 -Fc > path/to/elma365.bak |
Шаг 2. Установка PostgreSQL 18
Установите PostgreSQL 18 на все ноды кластера, в которых установлена версия 12 или ниже:
sudo apt install postgresql-18
Шаг 3. Обновление данных в каталоге базы данных
- В кластере PostrgeSQL определите Leader-ноду:
patronictl -c /etc/patroni/config.yml list
- На всех нодах кластера PostrgeSQL остановите Patroni:
sudo systemctl stop patroni.service
- На всех нодах кластера остановите PostgreSQL 12 или ниже и PostgreSQL 18:
sudo systemctl stop postgresql@12 postgresql@18
- Убедитесь, что кластеры PostgreSQL 12 или ниже и PostgreSQL 18 остановлены:
pg_lsclusters
- На 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— пути к каталогам данных.
- На 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
- На пути до PostgreSQL 18 откройте файл конфигурации Patroni:
sudo nano /etc/patroni/config.yml
- На каждой ноде кластера 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
...
- Получите наименование кластера PostgreSQL 12 или ниже:
sudo cat /etc/patroni/config.yml | grep "scope" | awk '{ print $2 }'
- На Leader-ноде в Patroni удалите кластер PostgreSQL 12 или ниже:
patronictl -c /etc/patroni/config.yml remove postgres-cluster
где:
postgres-cluster— наименование кластера PostgreSQL 12 или ниже, полученное на предыдущем этапе.
- На Leader-ноде запустите Patroni:
sudo systemctl start patroni.service
- На Replica-нодах удалите каталог данных PostgreSQL 18:
sudo rm -rf /var/lib/postgresql/18/main
- На Replica-нодах запустите Patroni:
sudo systemctl start patroni.service
Шаг 5. Проверка после установки
- Проверьте состояние кластера:
patronictl -c /etc/patroni/config.yml list
- Убедитесь, что PostgreSQL 18 работает корректно и данные доступны.
- Для оптимизации базы данных выполните команду на Leader-ноде:
sudo -u postgres /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages
Шаг 6. Очистка старых данных
начало внимание
Перед началом процесса очистки убедитесь, что у вас есть резервная копия данных и конфигурации.
конец внимание
При необходимости после успешного обновления и проверки PostgreSQL 18 вы можете очистить старые данные:
sudo -u postgres ./delete_old_cluster.sh