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

Материал из WiKi - UserSide
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
[[HOWTO:_PostgreSQL_version_upgrade|en]] | [[HOWTO:_Обновление_версии_PostgreSQL|ru]]
[[HOWTO:_PostgreSQL_version_upgrade|en]] | [[HOWTO:_Обновление_версии_PostgreSQL|ru]]


В данном разделе описана процедура обновления сервера PostgreSQL на новую основную версию (например, с 9.х на 11.х). Вы также можете обновиться на максимально доступную версию на момент выполнения обновления - все они обратно совместимы.
В данном разделе описана процедура обновления PostgreSQL ''между основными версиями'' (например, с версии 11 на версию 16).


Мы рекомендуем выполнять процедуру обновления сервера квалифицированным сотрудником используя официальную инструкцию: https://postgrespro.ru/docs/postgresql/11/upgrading.
Обновление внутри версии (например, с версии 16.1 на версию 16.2) ''происходит автоматически и не требует дополнительных действий''.


Обновление в пределах основной версии (например, с 11.1 на 11.3) осуществляется без каких либо дополнительных действий.
'''Рекомендуем ознакомиться с официальными инструкциями по обновлению''' на сайте [https://www.postgresql.org/docs/16/upgrading.html postgresql.org].


Существует несколько способов обновления. Здесь будет рассмотрен способ с полным дампом перед восстановлением и затем восстановлением из дампа после обновления. Также процедура будет описана для ОС Debian и ее производных (Ubuntu и т.д.). Для других дистрибутивов и ОС процедура практически точно такая же, но используются другие утилиты, специфичные для конкретного дистрибутива или ОС.
В дистрибутиве Debian и основанных на нем существует пакет [https://packages.debian.org/sid/postgresql-common postgresql-common], устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД.


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


Если в процессе обновления не удается успешно выполнить какую-то команду, пожалуйста, не продолжайте выполнять остальные пункты, пока не решите проблему. К сожалению, мы не являемся специалистами по всем проблемам PostgreSql, а также остальных служб, поэтому не всегда сможем дать квалифицированный ответ.
В следующем примере будет показано обновление кластера БД с версии 11 на версию 16 используя инструменты из пакета '''postgresql-common'''.


1. Остановите работу всех систем, использующих базу данных. Остановите работу php-fpm или apache2, а также временно отключите задачи в cron и остановите работающие модули usm_*.
Вся работа по обновлению кластера БД заключается в следующем:
# Остановить USERSIDE.
# Обновить текущую версии postgresql в пределах основной версии (например, с 11.5 до 11.22).
# Обновить расширение postgis до самой последней версии (например, с 2.5 до 3.1). Также обязательно обновить расширение и в самой базе данных.
# Установить новую версию postgresql не удаляя старой (например 16.1)
# Сделать запасную резервную копию базы данных и настроек
# Удалить кластер БД, созданный автоматически сценарием при установке новой версии
# Выполнить обновление кластера БД старой версии до кластера новой версии
# Проверить работу USERSIDE
# Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии


2. Проверьте, какие версии PostgreSql и PostGis у вас установлены на данный момент:
Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше).
sudo -u postgres psql -d userside -A -c "SELECT VERSION()"
sudo -u postgres psql -d userside -A -c "SELECT PostGIS_full_version()"


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 не удаляя старой(!).
=== Остановить USERSIDE ===
sudo apt-get install postgresql-11 postgresql-11-postgis-2.5 -y
<pre>
sudo supervisorctl stop all
sudo systemctl stop php8.1-fpm
</pre>
Версия php указана для примера. Используйте ту, что испльзуется у вас.


5. Выполните запасное резервное копирование всех баз данных сервера (в данном случае будет использоваться последняя версия утилиты pg_dumpall, но база данных будет использоваться все еще прежняя):
Закомментируйте запуск всех модулей и userside в crontab.
sudo -u postgres pg_dumpall > /tmp/dump_9.6_before_update.dump


6. Посмотрите, как выглядят ваши кластеры. Сейчас вы должны видеть две версии, обе в состоянии онлайн:
=== Обновить текущую версии postgresql в пределах основной версии ===
pg_lsclusters
Проверить текущие версии. Обновить текущие пакеты PostgreSQL и PostGIS:
Вы должны увидеть таблицу:
<pre>
Ver Cluster Port Status Owner    Data directory
sudo -u postgres psql -d userside -A -t -c "SELECT VERSION()"
9.6 main    5432 online postgres /var/lib/postgresql/9.6/main
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
11  main    5433 online postgres /var/lib/postgresql/11/main


7. При установке PostgreSql, установщик автоматически создает кластер с конфигурацией и базами данных, чтобы можно было начинать работу с базой данных сразу же. В случае обновления это лишняя операция и кластер для 11 версии нужно удалить. Мы будем его создавать на основе кластера версии 9.6:
sudo apt update
sudo pg_dropcluster 11 main --stop
sudo apt install --only-upgrade -y postgresql-11 postgresql-11-postgis-2.5
</pre>
Вместо 11 и 2.5 укажите те версии, которе фактически установлены у вас.


8. Остановите работу службы:
=== Обновить расширение postgis до самой последней версии ===
sudo systemctl stop postgresql
Обязательно также обновить расширение в базе данных!
<pre>
sudo apt install -y postgresql-11-postgis-3


9. Сделайте запасное резервное копирование текущих каталогов с файлами базы данных и файлами конфигураций. Будьте осторожны, файлы базы данных могут занимать очень много места, поэтому, возможно, будет лучше выбрать другое место для их размещения. Позже, если обновление пройдет успешно, эти каталоги нужно будет удалить:
sudo -u postgres psql -d userside -A -t -c "ALTER EXTENSION postgis UPDATE"
sudo cp -r /var/lib/postgresql/9.6/main/ /tmp/pg9.6-lib
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
sudo cp -r /etc/postgresql/9.6/main/ /tmp/pg9.6-etc
</pre>


10. Запустите процедуру создания нового кластера на основе старого (обновление версии кластера):
=== Установить новую версию postgresql не удаляя старой ===
sudo pg_upgradecluster -m upgrade 9.6 main
<pre>
sudo apt install -y postgresql-16 postgresql-16-postgis-3
</pre>


11. Запустите службу:
=== Сделать запасную резервную копию базы данных и настроек ===
sudo systemctl start postgresql
Число 11 в имени файлов — это номер версии PostgreSQL, к которой относится эта резервная копия.
<pre>
sudo -u postgres pg_dump --no-acl -Fp -Z 5 userside --file=userside_emergency_11.sql.gz
sudo -u postgres pg_dump --no-acl -Fc userside --file=/userside_emergency_11.dump
sudo tar xzf postgres_config_emergency_11.tgz /etc/postgresql/11/main
</pre>


12. Посмотрите, как выглядят ваши кластеры:
=== Удалить кластер БД, созданный автоматически сценарием при установке новой версии ===
pg_lsclusters
При помощи утилиты <code>pg_lsclusters</code> из postgresql-common посмотрите, как выглядят ваши кластеры БД:
Теперь вы должны увидеть вот такую таблицу, в которой версия 9.6 находится в состоянии down:
<pre>
Ver Cluster Port Status Owner    Data directory
sudo pg_lsclusters
  9.6 main    5433 down  postgres /var/lib/postgresql/9.6/main
</pre>
11 main    5432 online postgres /var/lib/postgresql/11/main
Вывод команды будет примерно следующим:
<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
16 main    5433 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16.log
</pre>
Кластер 16/main был создан автоматически сценарием установки postgresql. Его нужно остановить и удалить.
<pre>
sudo pg_dropcluster 16 main --stop
</pre>
Повторное выполнение команды <code>pg_lsclusters</code> должно показать, что у вас остался один кластер '''11/main'''.


13. Проверьте версии:
=== Выполнить обновление кластера БД старой версии до кластера новой версии ===
  sudo -u postgres psql -d userside -A -c "SELECT VERSION()"
Остановите службу postgresql
  sudo -u postgres psql -d userside -A -c "SELECT PostGIS_full_version()"
<pre>
sudo systemctl stop postgresql
</pre>
Запустите процесс обновления кластера БД '''11/main''' используя утилиту <code>pg_upgradecluster</code> из пакета postgresql-common. Это действие может занять много времени и дискового пространства.
<pre>
sudo pg_upgradecluster -m upgrade 11 main
</pre>
После завершения процедуры запустите службу postgres
<pre>
sudo systemctl start postgresql
</pre>
Проверьте, как выглядят ваши кластеры БД
<pre>
sudo pg_lsclusters
</pre>
Старая версия должна находиться в режиме '''down'''. Вывод команды будет примерно следующим:
<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
16 main    5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16.log
</pre>


14. Запустите все службы, которые вы остановили в п.1 и проверьте работу USERSIDE и модулей. Убедитесь, что всё работает корректно.
=== Проверить работу USERSIDE ===
Сначала выполните команды, отображающие версии, чтобы убедиться что база данных теперь работает на кластере БД новой версии:
<pre>
sudo -u postgres psql -d userside -A -t -c "SELECT VERSION()"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
</pre>
Вы должны увидеть 16ю версию postgresql и 3.1 версию postgis. Может быть к тому времени, как вы будете читать эти строки, версия postgis будет более новой.


15. После того, как вы убедились, что всё работает корректно, можно удалить временные резервные копии, а также старые пакеты:
Теперь запустите службу FPM и попробуйте зайти в USERSIDE через браузер.
sudo pg_dropcluster 9.6 main --stop
<pre>
sudo apt-get purge postgresql-9.6 postgresql-9.6-postgis-2.4 postgresql-9.6-postgis-2.5 -y
sudo systemctl start php8.1-fpm
sudo apt autoremove -y
</pre>
sudo rm -rf /tmp/pg9.6-* /tmp/dump_9.6_before_update.dump
Так как другие слудбы остановлены, вы, вероятно, увидите ошибки связанные с ними, но при этом интерфейс USERSIDE должен открыться без ошибок подключения к базе данных.
Если все успешно, то раскомментируйте закомментированные ранее строки в crontab и запустите внешние службы, находящиеся под управлением supervisor:
<pre>
sudo supervisorctl start all
sudo supervisorctl status
</pre>


Обновление PostgreSQL завершено.
=== Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии ===
Если USERSIDE работает корректно, ошибок взаимодействия с БД нет, то можно удалить старый кластер и пакеты. Вы также, по желанию, можете удалить аварийные резервные копии или подождать несколько дней, чтобы точно убедиться, что они не пригодятся.
<pre>
sudo pg_dropcluster 11 main --stop
sudo apt purge -y postgresql-11 postgresql-11-postgis-2.5 postgresql-11-postgis-3
sudo apt autoremove -y
sudo rm userside_emergency_11* postgres_config_emergency_11.tgz
</pre>


Видеоинструкция: https://youtu.be/c9ULVSz8yQM
Видеоинструкция (устаревшая версия): https://youtu.be/c9ULVSz8yQM

Версия от 11:59, 21 января 2024

en | ru

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

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

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

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

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

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

Вся работа по обновлению кластера БД заключается в следующем:

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

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

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

Остановить USERSIDE

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

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

Закомментируйте запуск всех модулей и userside в crontab.

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

Проверить текущие версии. Обновить текущие пакеты PostgreSQL и PostGIS:

sudo -u postgres psql -d userside -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

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

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

Обязательно также обновить расширение в базе данных!

sudo apt install -y postgresql-11-postgis-3

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()"

Установить новую версию postgresql не удаляя старой

sudo apt install -y postgresql-16 postgresql-16-postgis-3

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

Число 11 в имени файлов — это номер версии PostgreSQL, к которой относится эта резервная копия.

sudo -u postgres pg_dump --no-acl -Fp -Z 5 userside --file=userside_emergency_11.sql.gz
sudo -u postgres pg_dump --no-acl -Fc userside --file=/userside_emergency_11.dump
sudo tar xzf postgres_config_emergency_11.tgz /etc/postgresql/11/main

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

При помощи утилиты 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
16  main    5433 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16.log

Кластер 16/main был создан автоматически сценарием установки postgresql. Его нужно остановить и удалить.

sudo pg_dropcluster 16 main --stop

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

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

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

sudo systemctl stop postgresql

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

sudo pg_upgradecluster -m upgrade 11 main

После завершения процедуры запустите службу postgres

sudo systemctl start postgresql

Проверьте, как выглядят ваши кластеры БД

sudo pg_lsclusters

Старая версия должна находиться в режиме down. Вывод команды будет примерно следующим:

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
16  main    5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16.log

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

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

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

Вы должны увидеть 16ю версию postgresql и 3.1 версию postgis. Может быть к тому времени, как вы будете читать эти строки, версия postgis будет более новой.

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

sudo systemctl start php8.1-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-2.5 postgresql-11-postgis-3
sudo apt autoremove -y
sudo rm userside_emergency_11* postgres_config_emergency_11.tgz

Видеоинструкция (устаревшая версия): https://youtu.be/c9ULVSz8yQM