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

Материал из WiKi - UserSide
 
(не показано 14 промежуточных версий этого же участника)
Строка 5: Строка 5:
Обновление внутри версии (например, с версии 16.1 на версию 16.2) ''происходит автоматически и не требует дополнительных действий''.
Обновление внутри версии (например, с версии 16.1 на версию 16.2) ''происходит автоматически и не требует дополнительных действий''.


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


В дистрибутиве Debian и основанных на нем существует пакет [https://packages.debian.org/sid/postgresql-common postgresql-common], устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД.
В дистрибутиве Debian и основанных на нем существует пакет [https://packages.debian.org/sid/postgresql-common postgresql-common], устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД.


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


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


Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше).
Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше).
[https://asciinema.org/a/do2AE0z30mg5JLIuI9zhGTPoR Посмотреть видеоинструкцию на asciinema].


== Пошаговая инструкция ==
== Пошаговая инструкция ==
SQL-запросы с оператором <code>SELECT</code>, приведенные далее, необходимы для определения текущих установленных версий в качестве справочной информации.


=== Остановить USERSIDE ===
=== Остановить USERSIDE ===
Строка 65: Строка 68:
Число 11 в имени файлов — это номер версии PostgreSQL, к которой относится эта резервная копия.
Число 11 в имени файлов — это номер версии PostgreSQL, к которой относится эта резервная копия.
<pre>
<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 -Fp -Z 5 userside --file=/backup/userside_emergency_11.sql.gz
sudo -u postgres pg_dump --no-acl -Fc userside --file=/userside_emergency_11.dump
sudo -u postgres pg_dump --no-acl -Fc userside --file=/backup/userside_emergency_11.dump
sudo tar xzf postgres_config_emergency_11.tgz /etc/postgresql/11/main
sudo tar czf /backup/postgres_config_emergency_11.tgz -C /etc/postgresql/11/main .
</pre>
</pre>
Каталог /backup должен существовать и должен быть доступен для записи всем пользователям.


=== Удалить кластер БД, созданный автоматически сценарием при установке новой версии ===
=== Удалить кластер БД, созданный автоматически сценарием при установке новой версии ===
Строка 96: Строка 100:
sudo pg_upgradecluster -m upgrade 11 main
sudo pg_upgradecluster -m upgrade 11 main
</pre>
</pre>
После завершения процедуры запустите службу postgres
После завершения операции обновления вы увидите новое состояние кластеров (старая версия должна находиться в режиме '''down'''):
<pre>
sudo systemctl start postgresql
</pre>
Проверьте, как выглядят ваши кластеры БД
<pre>
sudo pg_lsclusters
</pre>
Старая версия должна находиться в режиме '''down'''. Вывод команды будет примерно следующим:
<pre>
<pre>
Ver Cluster Port Status Owner    Data directory              Log file
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
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
16  main    5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16.log
</pre>
Запустите службу postgres
<pre>
sudo systemctl start postgresql
</pre>
</pre>


Строка 117: Строка 117:
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
</pre>
</pre>
Вы должны увидеть 16ю версию postgresql и 3.1 версию postgis. Может быть к тому времени, как вы будете читать эти строки, версия postgis будет более новой.
Вы должны увидеть 16ю версию postgresql и 3.3.4 версию postgis. Может быть к тому времени, как вы будете читать эти строки, версия postgis будет более новой.


Теперь запустите службу FPM и попробуйте зайти в USERSIDE через браузер.
Теперь запустите службу FPM и зайдите в USERSIDE через браузер.
<pre>
<pre>
sudo systemctl start php8.1-fpm
sudo systemctl start php8.1-fpm
</pre>
</pre>
Так как другие слудбы остановлены, вы, вероятно, увидите ошибки связанные с ними, но при этом интерфейс USERSIDE должен открыться без ошибок подключения к базе данных.
Так как другие службы остановлены, вы, вероятно, увидите ошибки связанные с ними, но при этом интерфейс USERSIDE должен открыться без ошибок подключения к базе данных.
Если все успешно, то раскомментируйте закомментированные ранее строки в crontab и запустите внешние службы, находящиеся под управлением supervisor:
Если все успешно, то раскомментируйте закомментированные ранее строки в crontab и запустите внешние службы, находящиеся под управлением supervisor:
<pre>
<pre>
Строка 136: Строка 136:
sudo apt purge -y postgresql-11 postgresql-11-postgis-2.5 postgresql-11-postgis-3
sudo apt purge -y postgresql-11 postgresql-11-postgis-2.5 postgresql-11-postgis-3
sudo apt autoremove -y
sudo apt autoremove -y
sudo rm userside_emergency_11* postgres_config_emergency_11.tgz
sudo rm /backup/userside_emergency_11* /backup/postgres_config_emergency_11.tgz
sudo rm -rf /var/lib/postgresql/11/main
</pre>
</pre>
Видеоинструкция (устаревшая версия): https://youtu.be/c9ULVSz8yQM

Текущая версия от 06:57, 24 января 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.3.4). Также обязательно обновить расширение и в самой базе данных.
  4. Установить новую версию postgresql не удаляя старой (например 16.1)
  5. Сделать запасную резервную копию базы данных и настроек
  6. Удалить кластер БД, созданный автоматически сценарием при установке новой версии
  7. Выполнить обновление кластера БД старой версии до кластера новой версии
  8. Проверить работу USERSIDE
  9. Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии

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

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

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

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

Остановить 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=/backup/userside_emergency_11.sql.gz
sudo -u postgres pg_dump --no-acl -Fc userside --file=/backup/userside_emergency_11.dump
sudo tar czf /backup/postgres_config_emergency_11.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
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

После завершения операции обновления вы увидите новое состояние кластеров (старая версия должна находиться в режиме 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

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

sudo systemctl start postgresql

Проверить работу 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.3.4 версию 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 /backup/userside_emergency_11* /backup/postgres_config_emergency_11.tgz
sudo rm -rf /var/lib/postgresql/11/main