HOWTO: Обновление версии PostgreSQL: различия между версиями
Uscld2 (обсуждение | вклад) |
Uscld2 (обсуждение | вклад) Нет описания правки |
||
| Строка 1: | Строка 1: | ||
[[HOWTO:_PostgreSQL_version_upgrade|en]] | [[HOWTO:_Обновление_версии_PostgreSQL|ru]] | [[HOWTO:_PostgreSQL_version_upgrade|en]] | [[HOWTO:_Обновление_версии_PostgreSQL|ru]] | ||
В данном разделе описана процедура обновления PostgreSQL ''между основными версиями'' (например, с версии 11 на версию | В данном разделе описана процедура обновления PostgreSQL ''между основными версиями'' (например, с версии 11 на версию 17). | ||
Обновление внутри версии (например, с версии | Обновление внутри версии (например, с версии 17.1 на версию 17.2) ''происходит автоматически и не требует дополнительных действий''. | ||
'''Рекомендуем ознакомиться с официальными инструкциями по обновлению''' на сайте [https://www.postgresql.org/docs/current/upgrading.html postgresql.org]. | '''Рекомендуем ознакомиться с официальными инструкциями по обновлению''' на сайте [https://www.postgresql.org/docs/current/upgrading.html postgresql.org]. | ||
| Строка 11: | Строка 11: | ||
Кластером баз данных ([https://www.postgresql.org/docs/current/glossary.html Database cluster]) в PostgreSQL называется экземпляр сервера вместе со всеми обслуживаемыми БД, а не распределенную систему, как может показаться. | Кластером баз данных ([https://www.postgresql.org/docs/current/glossary.html Database cluster]) в PostgreSQL называется экземпляр сервера вместе со всеми обслуживаемыми БД, а не распределенную систему, как может показаться. | ||
В следующем примере будет показано обновление кластера БД с версии 11 на версию | В следующем примере будет показано обновление кластера БД с версии 11 на версию 17 используя инструменты из пакета '''postgresql-common'''. | ||
== Порядок обновления == | == Порядок обновления == | ||
| Строка 17: | Строка 17: | ||
# Обновить текущую версии postgresql в пределах основной версии (например, с 11.5 до 11.22). | # Обновить текущую версии postgresql в пределах основной версии (например, с 11.5 до 11.22). | ||
# Обновить расширение postgis до самой последней версии (например, с 2.5 до 3.3.4). Также обязательно обновить расширение и в самой базе данных. | # Обновить расширение postgis до самой последней версии (например, с 2.5 до 3.3.4). Также обязательно обновить расширение и в самой базе данных. | ||
# Установить новую версию postgresql не удаляя старой (например | # Установить новую версию postgresql не удаляя старой (например 17.1) | ||
# Сделать запасную резервную копию базы данных и настроек | # Сделать запасную резервную копию базы данных и настроек | ||
# Удалить кластер БД, созданный автоматически сценарием при установке новой версии | # Удалить кластер БД, созданный автоматически сценарием при установке новой версии | ||
| Строка 45: | Строка 45: | ||
sudo -u postgres psql -d userside -A -t -c "SELECT VERSION()" | 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 -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()" | ||
sudo -u postgres psql -d postgres -A -t -c "SELECT PostGIS_full_version()" | |||
sudo apt update | sudo apt update | ||
| Строка 52: | Строка 53: | ||
=== Обновить расширение postgis до самой последней версии === | === Обновить расширение postgis до самой последней версии === | ||
Обязательно также обновить расширение в базе данных! | Обязательно также обновить расширение в базе данных! Если предыдущие команды также показали наличие расширения в базе данных postgres, то postgis нужно обновить и для нее. | ||
<pre> | <pre> | ||
sudo apt install -y postgresql-11-postgis-3 | sudo apt install -y postgresql-11-postgis-3 | ||
sudo -u postgres psql -d postgres -A -t -c "ALTER EXTENSION postgis UPDATE" | |||
sudo -u postgres psql -d postgres -A -t -c "SELECT PostGIS_full_version()" | |||
sudo -u postgres psql -d userside -A -t -c "ALTER EXTENSION postgis UPDATE" | sudo -u postgres psql -d userside -A -t -c "ALTER EXTENSION postgis UPDATE" | ||
| Строка 62: | Строка 66: | ||
=== Установить новую версию postgresql не удаляя старой === | === Установить новую версию postgresql не удаляя старой === | ||
<pre> | <pre> | ||
sudo apt install -y postgresql- | sudo apt install -y postgresql-17 postgresql-17-postgis-3 | ||
</pre> | </pre> | ||
| Строка 83: | Строка 87: | ||
Ver Cluster Port Status Owner Data directory Log file | 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 | 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> | </pre> | ||
Кластер | Кластер 17/main был создан автоматически сценарием установки postgresql. Его нужно остановить и удалить. | ||
<pre> | <pre> | ||
sudo pg_dropcluster | sudo pg_dropcluster 17 main --stop | ||
</pre> | </pre> | ||
Повторное выполнение команды <code>pg_lsclusters</code> должно показать, что у вас остался один кластер '''11/main'''. | Повторное выполнение команды <code>pg_lsclusters</code> должно показать, что у вас остался один кластер '''11/main'''. | ||
| Строка 104: | Строка 108: | ||
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 | ||
17 main 5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17.log | |||
</pre> | </pre> | ||
Запустите службу postgres | Запустите службу postgres | ||
| Строка 117: | Строка 121: | ||
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> | ||
Вы должны увидеть | Вы должны увидеть 17ю версию postgresql и 3.3.4 версию postgis. Может быть к тому времени, как вы будете читать эти строки, версия postgis будет более новой. | ||
Теперь запустите службу FPM и зайдите в USERSIDE через браузер. | Теперь запустите службу FPM и зайдите в USERSIDE через браузер. | ||
Версия от 12:11, 20 августа 2025
В данном разделе описана процедура обновления PostgreSQL между основными версиями (например, с версии 11 на версию 17).
Обновление внутри версии (например, с версии 17.1 на версию 17.2) происходит автоматически и не требует дополнительных действий.
Рекомендуем ознакомиться с официальными инструкциями по обновлению на сайте postgresql.org.
В дистрибутиве Debian и основанных на нем существует пакет postgresql-common, устанавливаемый автоматически при установке пакета PostgreSQL. В состав postgresql-common входят инструменты, упрощающие работу с кластерами баз данных PostgreSQL. В том числе и обновление кластеров БД.
Кластером баз данных (Database cluster) в PostgreSQL называется экземпляр сервера вместе со всеми обслуживаемыми БД, а не распределенную систему, как может показаться.
В следующем примере будет показано обновление кластера БД с версии 11 на версию 17 используя инструменты из пакета postgresql-common.
Порядок обновления
- Остановить USERSIDE.
- Обновить текущую версии postgresql в пределах основной версии (например, с 11.5 до 11.22).
- Обновить расширение postgis до самой последней версии (например, с 2.5 до 3.3.4). Также обязательно обновить расширение и в самой базе данных.
- Установить новую версию postgresql не удаляя старой (например 17.1)
- Сделать запасную резервную копию базы данных и настроек
- Удалить кластер БД, созданный автоматически сценарием при установке новой версии
- Выполнить обновление кластера БД старой версии до кластера новой версии
- Проверить работу USERSIDE
- Удалить кластер БД старой версии, устаревшие пакеты и запасные резервные копии
Выделите время на эту операцию. Она может занять довольно продролжительное время в зависимости от размера базы данных и производительности сервера. Также обязательно убедитесь в наличии свободного места, которое понадобится для обновления кластера (как минимум столько же, сколько занимает текущий кластер, но лучше больше).
Посмотреть видеоинструкцию на asciinema.
Пошаговая инструкция
SQL-запросы с оператором SELECT, приведенные далее, необходимы для определения текущих установленных версий в качестве справочной информации.
Остановить USERSIDE
sudo supervisorctl stop all sudo systemctl stop php8.3-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 -u postgres psql -d postgres -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 до самой последней версии
Обязательно также обновить расширение в базе данных! Если предыдущие команды также показали наличие расширения в базе данных postgres, то postgis нужно обновить и для нее.
sudo apt install -y postgresql-11-postgis-3 sudo -u postgres psql -d postgres -A -t -c "ALTER EXTENSION postgis UPDATE" sudo -u postgres psql -d postgres -A -t -c "SELECT PostGIS_full_version()" 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-17 postgresql-17-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 17 main 5433 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17.log
Кластер 17/main был создан автоматически сценарием установки postgresql. Его нужно остановить и удалить.
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):
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 -d userside -A -t -c "SELECT VERSION()" sudo -u postgres psql -d userside -A -t -c "SELECT PostGIS_full_version()"
Вы должны увидеть 17ю версию postgresql и 3.3.4 версию postgis. Может быть к тому времени, как вы будете читать эти строки, версия 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-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