﻿# Обновление кластера PostgreSQL 12 и ниже до версии 18

> [HTML Version](upgrading-postgresql-cluster-10-to-15.html)

При обновлении PostgreSQL до основной версии используется утилита \[OBJECT\]. Она позволяет обновлять данные, хранящиеся в файлах данных PostgreSQL, до более поздней версии PostgreSQL.

Обновление кластера PostgreSQL состоит из нескольких этапов:

1. [Резервное копирование базы данных.](#database-backup)

2. [Установка PostgreSQL 18.](#install-postgresql15)

3. [Обновление данных в каталоге базы данных.](#updating-data)

4. [Запуск кластера Patroni.](#starting-patroni-cluster)

5. [Проверка после установки.](#check-after-installing)

6. [Очистка старых данных.](#clear-old-data)

## Шаг 1. Резервное копирование базы данных

Перед выполнением любых действий, связанных с обновлением, создайте резервную копию данных и конфигурации PostgreSQL. О том, как это сделать, читайте в статье [«Резервное копирование и восстановление баз данных»](database-backup-and-recovery.md).

````
начало внимание

````
Если на сервере PostgreSQL имеются сторонние базы данных, их резервные копии также необходимо создать.

````
конец внимание

````
Резервное копирование базы данных PostgreSQL без использования утилиты elma365-backupper

Вы можете создать резервную копию базы данных \[OBJECT\] с помощью утилиты \[OBJECT\]:

````
sudo -u postgres pg\_dump elma365 -Fc > path/to/elma365.bak 
````

## ````
Шаг 2. Установка PostgreSQL 18

Установите PostgreSQL 18 на все ноды кластера, в которых установлена версия 12 или ниже:

````
sudo apt install postgresql-18

## ````
Шаг 3. Обновление данных в каталоге базы данных

````
Начало примечание

````
**Важно**: в новых версиях PostgreSQL были изменены или удалены некоторые параметры. Чтобы избежать ошибок, перед обновлением данных проверьте совместимость параметров PostgreSQL в конфигурации Patroni. Актуальный список параметров смотрите в [официальной документации PostgreSQL](https://www.postgresql.org/docs/release/), а также в [официальной документации Patroni](https://patroni.readthedocs.io/en/latest/).

Основные изменения, которые могут повлиять на обновление:

- в версии PostgreSQL 12 параметр `promote\_trigger\_file` удалён;

- в версии PostgreSQL 13 параметр `wal\_keep\_segments` заменён на `wal\_keep\_size`;

- начиная с версии PostgreSQL 14 параметр `standard\_conforming\_strings` всегда включён;

- в версии PostgreSQL 16 параметр `vacuum\_defer\_cleanup\_age` удалён.

````
Конец примечание

1. ````
В кластере PostrgeSQL определите Leader-ноду:

````
patronictl -c /etc/patroni/config.yml list

2. ````
На всех нодах кластера PostrgeSQL остановите Patroni:

````
sudo systemctl stop patroni.service

3. ````
На всех нодах кластера остановите PostgreSQL 12 или ниже и PostgreSQL 18:

````
sudo systemctl stop postgresql@12 postgresql@18

4. ````
Убедитесь, что кластеры PostgreSQL 12 или ниже и PostgreSQL 18 остановлены:

````
pg\_lsclusters

5. ````
На 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

````
где:

- \[OBJECT\] и \[OBJECT\] — пути к бинарным файлам PostgreSQL версий 12 и 18;

- \[OBJECT\] и \[OBJECT\] — пути к каталогам данных.

6. На 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

````
где:

- \[OBJECT\] и \[OBJECT\] — пути к бинарным файлам PostgreSQL версий 12 и 18;

- \[OBJECT\] и \[OBJECT\] — пути к каталогам данных.

## Шаг 4. Запуск кластера Patroni

1. На пути до PostgreSQL 18 откройте файл конфигурации Patroni:

````
sudo nano /etc/patroni/config.yml

2. ````
На каждой ноде кластера PostgreSQL замените параметры \[OBJECT\], \[OBJECT\] и \[OBJECT\], например:

````
...  
data\_dir: /var/lib/postgresql/18/main  
bin\_dir: /usr/lib/postgresql/18/bin  
config\_dir: /etc/postgresql/18/main  
...

3. ````
Получите наименование кластера PostgreSQL 12 или ниже:

````
sudo cat /etc/patroni/config.yml | grep "scope" | awk '\{ print \$2 \}'

4. ````
На Leader-ноде в Patroni удалите кластер PostgreSQL 12 или ниже:

````
patronictl -c /etc/patroni/config.yml remove postgres-cluster

````
где:

- \[OBJECT\] — наименование кластера PostgreSQL 12 или ниже, полученное на предыдущем этапе.

5. На Leader-ноде запустите Patroni:

````
sudo systemctl start patroni.service

6. ````
На Replica-нодах удалите каталог данных PostgreSQL 18:

````
sudo rm -rf /var/lib/postgresql/18/main

7. ````
На Replica-нодах запустите Patroni:

````
sudo systemctl start patroni.service

## ````
Шаг 5. Проверка после установки

1. Проверьте состояние кластера:

````
patronictl -c /etc/patroni/config.yml list

2. ````
Убедитесь, что PostgreSQL 18 работает корректно и данные доступны. 

3. Для оптимизации базы данных выполните команду на Leader-ноде:

````
sudo -u postgres /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages

## ````
Шаг 6. Очистка старых данных

````
начало внимание

````
Перед началом процесса очистки убедитесь, что у вас есть резервная копия данных и конфигурации.

````
конец внимание

````
При необходимости после успешного обновления и проверки PostgreSQL 18 вы можете очистить старые данные:

````
sudo -u postgres ./delete\_old\_cluster.sh
````