HOWTO: Обновление версии PostgreSQL: различия между версиями

Материал из WiKi - UserSide
Нет описания правки
Нет описания правки
 
(не показано 28 промежуточных версий 2 участников)
Строка 1: Строка 1:
В данном разделе описана процедура обновления сервера PostgreSQL на новую основную версию (например, с 9.х на 11.х). Вы также можете обновиться на максимально доступную версию на момент выполнения обновления - все они обратно совместимы.
[[HOWTO:_PostgreSQL_version_upgrade|en]] | [[HOWTO:_Обновление_версии_PostgreSQL|ru]]


Мы рекомендуем выполнять процедуру обновления сервера квалифицированным сотрудником используя официальную инструкцию: https://postgrespro.ru/docs/postgresql/11/upgrading.
В данном разделе описана процедура обновления PostgreSQL ''между основными версиями'' (например, с версии 11 на версию 17).


Обновление в пределах основной версии (например, с 11.1 на 11.3) осуществляется без каких либо дополнительных действий.
Обновление внутри версии (например, с версии 17.1 на версию 17.2) ''происходит автоматически и не требует дополнительных действий''.


Существует несколько способов обновления. Здесь будет рассмотрен способ с полным дампом перед восстановлением и затем восстановлением из дампа после обновления. Также процедура будет описана для ОС Debian и ее производных (Ubuntu и т.д.). Для других дистрибутивов и ОС процедура практически точно такая же, но используются другие утилиты, специфичные для конкретного дистрибутива или ОС.
'''Рекомендуем ознакомиться с официальными инструкциями по обновлению''' на сайте [https://www.postgresql.org/docs/current/upgrading.html postgresql.org].


Предполагается, что установка PostgreSql осуществлялась по этой инструкции и в систему добавлены репозитории PostgreSql, предоставляющие доступ к различным версиям PostgreSql и расширениям, а также установка производилась по этой инструкции и был установлен пакет '''postgresql-9.6''', а не ''метапакет'' postgresql. Если у вас установлен метапакет, то обновление должно произойти автоматически при обновлении метапакета, но не факт, что оно пройдет корректно. Мы рекомендуем использовать конкретные пакеты (с указанием версии) вместо метапакетов.
В дистрибутиве Debian и основанных на нем существует пакет [https://packages.debian.org/sid/postgresql-common postgresql-common], устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД.


Если в процессе обновления не удается успешно выполнить какую-то команду, пожалуйста, не продолжайте выполнять остальные пункты, пока не решите проблему. К сожалению, мы не являемся специалистами по всем проблемам PostgreSql, а также остальных служб, поэтому не всегда сможем дать квалифицированный ответ.
Кластером баз данных ([https://www.postgresql.org/docs/current/glossary.html Database cluster]) в PostgreSQL называется экземпляр сервера вместе со всеми обслуживаемыми БД, а не распределенную систему, как может показаться.


1. Остановите работу всех систем, использующих базу данных. Остановите работу php-fpm или apache2, а также временно отключите задачи в cron и остановите работающие модули usm_*.
В следующем примере будет показано обновление кластера БД с версии 11 на версию 17 используя инструменты из пакета '''postgresql-common'''.


2. Проверьте, какие версии PostgreSql и PostGis у вас установлены на данный момент:
== Порядок обновления ==
sudo -u postgres psql -d userside -A -c "SELECT VERSION()"
# Остановить USERSIDE.
sudo -u postgres psql -d userside -A -c "SELECT PostGIS_full_version()"
# Обновить текущую версию пакета postgresql в пределах основной версии (например, с 11.5 до 11.22).
# Обновить версию пакета postgis до самой последней версии (например, с 2.5 до 3.3.4).
# Обновить расширение PostGIS во всех базах данных кластера.
# Установить новую версию пакета postgresql не удаляя старой (например 17.1)
# Сделать запасную резервную копию базы данных и настроек
# Удалить кластер БД, созданный автоматически сценарием при установке новой версии
# Выполнить обновление кластера БД старой версии до кластера новой версии
# Проверить работу USERSIDE
# Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии


3. Обновите текущие версии, а также, если у вас установлен PostGis 2.4, установите PostGis 2.5 и обновите это расширение в базе данных, затем убедитесь, что расширение в базе данных обновлено:
Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше).
sudo apt-get update
sudo apt-get --only-upgrade install postgresql-9.6 postgresql-9.6-postgis-2.4 -y
sudo apt-get install postgresql-9.6-postgis-2.5 -y
sudo -u postgres psql -d userside -A -c "ALTER EXTENSION postgis UPDATE"
sudo -u postgres psql -d postgres -A -c "ALTER EXTENSION postgis UPDATE"
sudo -u postgres psql -d userside -A -c "SELECT PostGIS_full_version()"
sudo -u postgres psql -d postgres -A -c "SELECT PostGIS_full_version()"


4. Установите новую версию PostgreSql и PostGis не удаляя старой(!).
[https://asciinema.org/a/do2AE0z30mg5JLIuI9zhGTPoR Посмотреть видеоинструкцию на asciinema].
sudo apt-get install postgresql-11 postgresql-11-postgis-2.5 -y


5. Выполните запасное резервное копирование всех баз данных сервера (в данном случае будет использоваться последняя версия утилиты pg_dumpall, но база данных будет использоваться все еще прежняя):
== Пошаговая инструкция ==
sudo -u postgres pg_dumpall > /tmp/dump_9.6_before_update.dump
SQL-запросы с оператором <code>SELECT</code>, приведенные далее, необходимы для определения текущих установленных версий в качестве справочной информации.


6. Посмотрите, как выглядят ваши кластеры. Сейчас вы должны видеть две версии, обе в состоянии онлайн:
=== Остановить USERSIDE ===
pg_lsclusters
<pre>
Вы должны увидеть таблицу:
sudo supervisorctl stop all
Ver Cluster Port Status Owner    Data directory
sudo systemctl stop php8.3-fpm
9.6 main    5432 online postgres /var/lib/postgresql/9.6/main
</pre>
11  main    5433 online postgres /var/lib/postgresql/11/main
Версия php указана для примера. Используйте ту, что испльзуется у вас.


7. При установке PostgreSql, установщик автоматически создает кластер с конфигурацией и базами данных, чтобы можно было начинать работу с базой данных сразу же. В случае обновления это лишняя операция и кластер для 11 версии нужно удалить. Мы будем его создавать на основе кластера версии 9.6:
Закомментируйте запуск всех модулей и userside в crontab. Если используете [[Usm_poller_(as_satellite)|сателлиты]], остановите службы и на них.
sudo pg_dropcluster 11 main --stop


8. Остановите работу службы
=== Обновить текущую версии postgresql в пределах основной версии ===
sudo systemctl stop postgresql
Проверить текущие версии системных пакетов PostgreSQL и PostGIS. Обновить текущие установленные версии PostgreSQL и PostGIS до посладних версий в пределах их основных версий, а также, если текущая версия PostGIS ниже 3, установить дополнительно пакет PostGIS 3 для вашей версии PostgreSQL. Если у вас уже сейчас установлен PostGIS 3, то вам нужно только лишь его обновить до последней версии.
<pre>
# получить версию postgresql и версию расширения postgis для базы данных userside
sudo -u postgres psql -A -t -c "SELECT VERSION()"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"


9. Сделайте запасное резервное копирование текущих каталогов с файлами базы данных и файлами конфигураций. Будьте осторожны, файлы базы данных могут занимать очень много места, поэтому, возможно, будет лучше выбрать другое место для их размещения. Позже, если обновление пройдет успешно, эти каталоги нужно будет удалить:
# обновить такущие версии пакетов
sudo cp -r /var/lib/postgresql/9.6/main/ /tmp/pg9.6-lib
sudo apt update
sudo cp -r /etc/postgresql/9.6/main/ /tmp/pg9.6-etc
sudo apt install --only-upgrade -y postgresql-11 postgresql-11-postgis-2.5
# только если текущая версия postgis ниже 3, дополнительно установить postgis-3 для текущей версии postgres
sudo apt install -y postgresql-11-postgis-3
</pre>
Вместо 11 и 2.5, конечно же, укажите те версии, которе фактически установлены у вас.


10. Запустите процедуру создания нового кластера на основе старого (обновление версии кластера):
=== Обновить расширение postgis до самой последней версии ===
sudo pg_upgradecluster -m upgrade 9.6 main
После обновления пакета postgis необходимо соответственно обновить и само расширение postgis в базах данных, где это расширение присутствует. У вас может быть, например, копия базы данных userside для тестов - не забудьте про нее.
<pre>
sudo -u postgres psql -d userside -A -t -c "ALTER EXTENSION postgis UPDATE"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
</pre>
Вторая команда отобразит текущую версию расширения PostGIS после обновления.


11. Запустите службу:
=== Обновление с PostGIS 2.5 на PostGIS 3.x ===
sudo systemctl start postgresql
Если предыдущий запрос <code>SELECT PostGIS_full_version()</code> отображает информацию подобно такой:
<pre>
POSTGIS="3.3.4 3.3.4" [EXTENSION] . . .
. . .
[UNPACKAGED!] (raster procs from "2.5.5 r0" need upgrade)
</pre>
То следующая информация для вас. Иначе пропустите этот раздел.


12. Посмотрите, как выглядят ваши кластеры:
Между версиям PosGIS 2 и 3 существует некоторая разница, которая требует дополнительных действий при обновлении.
pg_lsclusters
<pre>
Теперь вы должны увидеть вот такую таблицу, в которой версия 9.6 находится в состоянии down:
# дважды один и тот же запрос
Ver Cluster Port Status Owner    Data directory
sudo -u postgres psql -d userside -A -t -c "SELECT postgis_extensions_upgrade()"
9.6 main    5433 down  postgres /var/lib/postgresql/9.6/main
sudo -u postgres psql -d userside -A -t -c "SELECT postgis_extensions_upgrade()"
11  main    5432 online postgres /var/lib/postgresql/11/main
# удалить расширение raster, которое раньше было частью расширения postgis
sudo -u postgres psql -d userside -A -t -c "DROP EXTENSION postgis_raster"
</pre>


13. Проверьте версии:
=== Установить новые версии пакетов ===
sudo -u postgres psql -d userside -A -c "SELECT VERSION()"
Также удалить старый пакет postgis версии 2, если он был установлен.
sudo -u postgres psql -d userside -A -c "SELECT PostGIS_full_version()"
<pre>
sudo apt install -y postgresql-17 postgresql-17-postgis-3
sudo apt purge -y postgresql-11-postgis-2.5
</pre>


14. Запустите все службы, которые вы остановили в п.1 и проверьте работу USERSIDE и модулей. Убедитесь, что всё работает корректно.
=== Сделать запасную резервную копию базы данных и конфигурации ===
Инструмент миграции кластеров делает это абсолютно безопасно, однако дополнительная осторожность лишней не будет. Сделайте запасные временные резервные копии нужных баз данных и конфигурации, которые в конце обновления можно будет смело удалить.
<pre>
sudo -u postgres pg_dump --no-acl -Fp -Z 5 userside --file=/backup/userside_emergency.sql.gz
sudo -u postgres pg_dump --no-acl -Fc userside --file=/backup/userside_emergency.dump
sudo tar czf /backup/postgres_config_emergency.tgz -C /etc/postgresql/11/main .
</pre>
Каталог /backup должен существовать и должен быть доступен для записи всем пользователям.


15. После того, как вы убедились, что всё работает корректно, можно удалить временные резервные копии, а также старые пакеты:
=== Удалить автоматически созданный кластер БД ===
  sudo pg_dropcluster 9.6 main --stop
При помощи утилиты <code>pg_lsclusters</code> из postgresql-common посмотрите, как выглядят ваши кластеры БД:
  sudo apt-get purge postgresql-9.6 postgresql-9.6-postgis-2.4 postgresql-9.6-postgis-2.5 -y
<pre>
sudo apt autoremove -y
sudo pg_lsclusters
sudo rm -rf /tmp/pg9.6-* /tmp/dump_9.6_before_update.dump
</pre>
Вывод команды будет примерно следующим:
<pre>
Ver Cluster Port Status Owner    Data directory              Log file
11 main   5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11.log
17 main    5433 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17.log
</pre>
Кластер 17/main был создан автоматически сценарием установки postgresql и использует новый порт 5433. Его нужно остановить и удалить — он не нужен, т.к. будет выполняться процедура миграции кластера, которая создаст новый кластер автоматически.
<pre>
sudo pg_dropcluster 17 main --stop
</pre>
Повторное выполнение команды <code>pg_lsclusters</code> должно показать, что у вас остался один кластер '''11/main'''.


Обновление PostgreSQL завершено.
=== Выполнить обновление кластера БД старой версии до кластера новой версии ===
Остановите службу postgresql
<pre>
sudo systemctl stop postgresql
</pre>
Запустите процесс обновления кластера БД '''11/main''' используя утилиту <code>pg_upgradecluster</code> из пакета postgresql-common. Это действие может занять много времени и дискового пространства.
<pre>
sudo pg_upgradecluster 11 main
</pre>
После завершения операции обновления вы увидите новое состояние кластеров (старая версия должна находиться в режиме '''down''' и порт 5432 теперь назначен новому кластеру '''17/main'''):
<pre>
Ver Cluster Port Status Owner    Data directory              Log file
11  main    5433 down  postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11.log
17  main    5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17.log
</pre>
Запустите службу postgres
<pre>
sudo systemctl start postgresql
</pre>


Видеоинструкция: https://youtu.be/c9ULVSz8yQM
=== Проверить работу USERSIDE ===
Сначала выполните команды, отображающие версии, чтобы убедиться что база данных теперь работает на кластере БД новой версии:
<pre>
sudo -u postgres psql -A -t -c "SELECT VERSION()"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
</pre>
Вы должны увидеть 17ю версию postgresql и 3.x.x версию postgis.
 
Теперь запустите службу FPM и зайдите в USERSIDE через браузер.
<pre>
sudo systemctl start php8.3-fpm
</pre>
Так как другие службы остановлены, вы, вероятно, увидите ошибки связанные с ними, но при этом интерфейс USERSIDE должен открыться без ошибок подключения к базе данных.
Если все успешно, то раскомментируйте закомментированные ранее строки в crontab и запустите внешние службы, находящиеся под управлением supervisor, в том числе на сателлите:
<pre>
sudo supervisorctl start all
sudo supervisorctl status
</pre>
 
=== Очистка после успешного обновления ===
Если USERSIDE работает корректно, ошибок взаимодействия с БД нет, то можно удалить старый кластер и пакеты. Вы также, по желанию, можете удалить аварийные резервные копии или подождать несколько дней, чтобы точно убедиться, что они не пригодятся.
<pre>
sudo pg_dropcluster 11 main --stop
sudo apt purge -y postgresql-11 postgresql-11-postgis-3
sudo apt autoremove -y
sudo rm /backup/userside_emergency* /backup/postgres_config_emergency.tgz
sudo rm -rf /var/lib/postgresql/11/main
</pre>

Текущая версия от 06:07, 21 августа 2025

en | ru

В данном разделе описана процедура обновления PostgreSQL между основными версиями (например, с версии 11 на версию 17).

Обновление внутри версии (например, с версии 17.1 на версию 17.2) происходит автоматически и не требует дополнительных действий.

Рекомендуем ознакомиться с официальными инструкциями по обновлению на сайте postgresql.org.

В дистрибутиве Debian и основанных на нем существует пакет postgresql-common, устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД.

Кластером баз данных (Database cluster) в PostgreSQL называется экземпляр сервера вместе со всеми обслуживаемыми БД, а не распределенную систему, как может показаться.

В следующем примере будет показано обновление кластера БД с версии 11 на версию 17 используя инструменты из пакета postgresql-common.

Порядок обновления

  1. Остановить USERSIDE.
  2. Обновить текущую версию пакета postgresql в пределах основной версии (например, с 11.5 до 11.22).
  3. Обновить версию пакета postgis до самой последней версии (например, с 2.5 до 3.3.4).
  4. Обновить расширение PostGIS во всех базах данных кластера.
  5. Установить новую версию пакета postgresql не удаляя старой (например 17.1)
  6. Сделать запасную резервную копию базы данных и настроек
  7. Удалить кластер БД, созданный автоматически сценарием при установке новой версии
  8. Выполнить обновление кластера БД старой версии до кластера новой версии
  9. Проверить работу USERSIDE
  10. Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии

Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше).

Посмотреть видеоинструкцию на asciinema.

Пошаговая инструкция

SQL-запросы с оператором SELECT, приведенные далее, необходимы для определения текущих установленных версий в качестве справочной информации.

Остановить USERSIDE

sudo supervisorctl stop all
sudo systemctl stop php8.3-fpm

Версия php указана для примера. Используйте ту, что испльзуется у вас.

Закомментируйте запуск всех модулей и userside в crontab. Если используете сателлиты, остановите службы и на них.

Обновить текущую версии postgresql в пределах основной версии

Проверить текущие версии системных пакетов PostgreSQL и PostGIS. Обновить текущие установленные версии PostgreSQL и PostGIS до посладних версий в пределах их основных версий, а также, если текущая версия PostGIS ниже 3, установить дополнительно пакет PostGIS 3 для вашей версии PostgreSQL. Если у вас уже сейчас установлен PostGIS 3, то вам нужно только лишь его обновить до последней версии.

# получить версию postgresql и версию расширения postgis для базы данных userside
sudo -u postgres psql -A -t -c "SELECT VERSION()"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"

# обновить такущие версии пакетов
sudo apt update
sudo apt install --only-upgrade -y postgresql-11 postgresql-11-postgis-2.5
# только если текущая версия postgis ниже 3, дополнительно установить postgis-3 для текущей версии postgres
sudo apt install -y postgresql-11-postgis-3

Вместо 11 и 2.5, конечно же, укажите те версии, которе фактически установлены у вас.

Обновить расширение postgis до самой последней версии

После обновления пакета postgis необходимо соответственно обновить и само расширение postgis в базах данных, где это расширение присутствует. У вас может быть, например, копия базы данных userside для тестов - не забудьте про нее.

sudo -u postgres psql -d userside -A -t -c "ALTER EXTENSION postgis UPDATE"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"

Вторая команда отобразит текущую версию расширения PostGIS после обновления.

Обновление с PostGIS 2.5 на PostGIS 3.x

Если предыдущий запрос SELECT PostGIS_full_version() отображает информацию подобно такой:

POSTGIS="3.3.4 3.3.4" [EXTENSION] . . .
. . .
[UNPACKAGED!] (raster procs from "2.5.5 r0" need upgrade)

То следующая информация для вас. Иначе пропустите этот раздел.

Между версиям PosGIS 2 и 3 существует некоторая разница, которая требует дополнительных действий при обновлении.

# дважды один и тот же запрос
sudo -u postgres psql -d userside -A -t -c "SELECT postgis_extensions_upgrade()"
sudo -u postgres psql -d userside -A -t -c "SELECT postgis_extensions_upgrade()"
# удалить расширение raster, которое раньше было частью расширения postgis
sudo -u postgres psql -d userside -A -t -c "DROP EXTENSION postgis_raster"

Установить новые версии пакетов

Также удалить старый пакет postgis версии 2, если он был установлен.

sudo apt install -y postgresql-17 postgresql-17-postgis-3
sudo apt purge -y postgresql-11-postgis-2.5

Сделать запасную резервную копию базы данных и конфигурации

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

sudo -u postgres pg_dump --no-acl -Fp -Z 5 userside --file=/backup/userside_emergency.sql.gz
sudo -u postgres pg_dump --no-acl -Fc userside --file=/backup/userside_emergency.dump
sudo tar czf /backup/postgres_config_emergency.tgz -C /etc/postgresql/11/main .

Каталог /backup должен существовать и должен быть доступен для записи всем пользователям.

Удалить автоматически созданный кластер БД

При помощи утилиты pg_lsclusters из postgresql-common посмотрите, как выглядят ваши кластеры БД:

sudo pg_lsclusters

Вывод команды будет примерно следующим:

Ver Cluster Port Status Owner    Data directory              Log file
11  main    5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11.log
17  main    5433 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17.log

Кластер 17/main был создан автоматически сценарием установки postgresql и использует новый порт 5433. Его нужно остановить и удалить — он не нужен, т.к. будет выполняться процедура миграции кластера, которая создаст новый кластер автоматически.

sudo pg_dropcluster 17 main --stop

Повторное выполнение команды pg_lsclusters должно показать, что у вас остался один кластер 11/main.

Выполнить обновление кластера БД старой версии до кластера новой версии

Остановите службу postgresql

sudo systemctl stop postgresql

Запустите процесс обновления кластера БД 11/main используя утилиту pg_upgradecluster из пакета postgresql-common. Это действие может занять много времени и дискового пространства.

sudo pg_upgradecluster 11 main

После завершения операции обновления вы увидите новое состояние кластеров (старая версия должна находиться в режиме down и порт 5432 теперь назначен новому кластеру 17/main):

Ver Cluster Port Status Owner    Data directory              Log file
11  main    5433 down   postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11.log
17  main    5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17.log

Запустите службу postgres

sudo systemctl start postgresql

Проверить работу USERSIDE

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

sudo -u postgres psql -A -t -c "SELECT VERSION()"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"

Вы должны увидеть 17ю версию postgresql и 3.x.x версию postgis.

Теперь запустите службу FPM и зайдите в USERSIDE через браузер.

sudo systemctl start php8.3-fpm

Так как другие службы остановлены, вы, вероятно, увидите ошибки связанные с ними, но при этом интерфейс USERSIDE должен открыться без ошибок подключения к базе данных. Если все успешно, то раскомментируйте закомментированные ранее строки в crontab и запустите внешние службы, находящиеся под управлением supervisor, в том числе на сателлите:

sudo supervisorctl start all
sudo supervisorctl status

Очистка после успешного обновления

Если USERSIDE работает корректно, ошибок взаимодействия с БД нет, то можно удалить старый кластер и пакеты. Вы также, по желанию, можете удалить аварийные резервные копии или подождать несколько дней, чтобы точно убедиться, что они не пригодятся.

sudo pg_dropcluster 11 main --stop
sudo apt purge -y postgresql-11 postgresql-11-postgis-3
sudo apt autoremove -y
sudo rm /backup/userside_emergency* /backup/postgres_config_emergency.tgz
sudo rm -rf /var/lib/postgresql/11/main