HOWTO: Обновление версии PostgreSQL: различия между версиями
Uscld2 (обсуждение | вклад) |
Uscld2 (обсуждение | вклад) |
||
Строка 100: | Строка 100: | ||
sudo pg_upgradecluster -m upgrade 11 main | sudo pg_upgradecluster -m upgrade 11 main | ||
</pre> | </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> | ||
Версия от 06:56, 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