HOWTO: Обновление версии PostgreSQL: различия между версиями
Uscld2 (обсуждение | вклад) (Новая страница: «== Обновление PostgreSQL == В данном разделе описана процедура обновления сервера PostgreSQL на нов…») |
Uscld2 (обсуждение | вклад) |
||
(не показано 20 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
[[HOWTO:_PostgreSQL_version_upgrade|en]] | [[HOWTO:_Обновление_версии_PostgreSQL|ru]] | |||
В данном разделе описана процедура обновления | В данном разделе описана процедура обновления PostgreSQL ''между основными версиями'' (например, с версии 11 на версию 16). | ||
Обновление внутри версии (например, с версии 16.1 на версию 16.2) ''происходит автоматически и не требует дополнительных действий''. | |||
'''Рекомендуем ознакомиться с официальными инструкциями по обновлению''' на сайте [https://www.postgresql.org/docs/current/upgrading.html postgresql.org]. | |||
В дистрибутиве Debian и основанных на нем существует пакет [https://packages.debian.org/sid/postgresql-common postgresql-common], устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД. | |||
Кластером баз данных ([https://www.postgresql.org/docs/current/glossary.html Database cluster]) в PostgreSQL называется экземпляр сервера вместе со всеми обслуживаемыми БД, а не распределенную систему, как может показаться. | |||
В следующем примере будет показано обновление кластера БД с версии 11 на версию 16 используя инструменты из пакета '''postgresql-common'''. | |||
== Порядок обновления == | |||
# Остановить USERSIDE. | |||
# Обновить текущую версии postgresql в пределах основной версии (например, с 11.5 до 11.22). | |||
# Обновить расширение postgis до самой последней версии (например, с 2.5 до 3.3.4). Также обязательно обновить расширение и в самой базе данных. | |||
# Установить новую версию postgresql не удаляя старой (например 16.1) | |||
# Сделать запасную резервную копию базы данных и настроек | |||
# Удалить кластер БД, созданный автоматически сценарием при установке новой версии | |||
# Выполнить обновление кластера БД старой версии до кластера новой версии | |||
# Проверить работу USERSIDE | |||
# Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии | |||
Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше). | |||
[https://asciinema.org/a/do2AE0z30mg5JLIuI9zhGTPoR Посмотреть видеоинструкцию на asciinema]. | |||
== Пошаговая инструкция == | |||
SQL-запросы с оператором <code>SELECT</code>, приведенные далее, необходимы для определения текущих установленных версий в качестве справочной информации. | |||
=== Остановить USERSIDE === | |||
<pre> | |||
sudo supervisorctl stop all | |||
sudo systemctl stop php8.1-fpm | |||
</pre> | |||
Версия php указана для примера. Используйте ту, что испльзуется у вас. | |||
Закомментируйте запуск всех модулей и userside в crontab. | |||
=== Обновить текущую версии postgresql в пределах основной версии === | |||
Проверить текущие версии. Обновить текущие пакеты PostgreSQL и PostGIS: | |||
<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()" | |||
sudo apt update | |||
sudo apt install --only-upgrade -y postgresql-11 postgresql-11-postgis-2.5 | |||
</pre> | |||
Вместо 11 и 2.5 укажите те версии, которе фактически установлены у вас. | |||
=== Обновить расширение postgis до самой последней версии === | |||
Обязательно также обновить расширение в базе данных! | |||
<pre> | |||
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()" | |||
</pre> | |||
=== Установить новую версию postgresql не удаляя старой === | |||
<pre> | |||
sudo apt install -y postgresql-16 postgresql-16-postgis-3 | |||
</pre> | |||
=== Сделать запасную резервную копию базы данных и настроек === | |||
Число 11 в имени файлов — это номер версии PostgreSQL, к которой относится эта резервная копия. | |||
<pre> | |||
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 . | |||
</pre> | |||
Каталог /backup должен существовать и должен быть доступен для записи всем пользователям. | |||
=== Удалить кластер БД, созданный автоматически сценарием при установке новой версии === | |||
При помощи утилиты <code>pg_lsclusters</code> из postgresql-common посмотрите, как выглядят ваши кластеры БД: | |||
<pre> | |||
sudo pg_lsclusters | |||
</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 | |||
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'''. | |||
=== Выполнить обновление кластера БД старой версии до кластера новой версии === | |||
Остановите службу postgresql | |||
<pre> | |||
sudo systemctl stop postgresql | |||
</pre> | |||
Запустите процесс обновления кластера БД '''11/main''' используя утилиту <code>pg_upgradecluster</code> из пакета postgresql-common. Это действие может занять много времени и дискового пространства. | |||
<pre> | |||
sudo pg_upgradecluster -m upgrade 11 main | |||
</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> | |||
Запустите службу postgres | |||
<pre> | |||
sudo systemctl start postgresql | |||
</pre> | |||
=== Проверить работу 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.3.4 версию postgis. Может быть к тому времени, как вы будете читать эти строки, версия postgis будет более новой. | |||
Теперь запустите службу FPM и зайдите в USERSIDE через браузер. | |||
<pre> | |||
sudo systemctl start php8.1-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-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 | |||
</pre> |
Текущая версия от 06:57, 24 января 2024
В данном разделе описана процедура обновления PostgreSQL между основными версиями (например, с версии 11 на версию 16).
Обновление внутри версии (например, с версии 16.1 на версию 16.2) происходит автоматически и не требует дополнительных действий.
Рекомендуем ознакомиться с официальными инструкциями по обновлению на сайте postgresql.org.
В дистрибутиве Debian и основанных на нем существует пакет postgresql-common, устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД.
Кластером баз данных (Database cluster) в PostgreSQL называется экземпляр сервера вместе со всеми обслуживаемыми БД, а не распределенную систему, как может показаться.
В следующем примере будет показано обновление кластера БД с версии 11 на версию 16 используя инструменты из пакета postgresql-common.
Порядок обновления
- Остановить USERSIDE.
- Обновить текущую версии postgresql в пределах основной версии (например, с 11.5 до 11.22).
- Обновить расширение postgis до самой последней версии (например, с 2.5 до 3.3.4). Также обязательно обновить расширение и в самой базе данных.
- Установить новую версию postgresql не удаляя старой (например 16.1)
- Сделать запасную резервную копию базы данных и настроек
- Удалить кластер БД, созданный автоматически сценарием при установке новой версии
- Выполнить обновление кластера БД старой версии до кластера новой версии
- Проверить работу USERSIDE
- Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии
Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше).
Посмотреть видеоинструкцию на 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