PostgreSQL | Как обновить с 11 до 14 версии в Debian?

PostgreSQL | Как обновить с 11 до 14 версии в Debian?

Может оказаться такая ситуация, что после установки операционной системы Debian, вместе с ней установился пакет с СУБД PostgreSQL версии 11.

На август 2022 уже запланирован выпуск 15 версии PostgreSQL. СУБД динамично развивается и сообщество пополняется всё большим количеством администраторов этой СУБД.

Из-за этих особенностей Debian, для получения полного свежайшего функционала СУБД, нужно обновить её версию.

Как это сделать?

 

Подготовка к обновлению PostgreSQL

Обязательно сделайте ДАМП всех существующих данных.

Если вы под root пользователем, то смените его на пользователя postgres:

su - postgres

После этого перейдите в каталог временных файлов:

cd /tmp

Выполните команду полного копирования:

pg_dumpall > my_pg_backup.sql

При необходимости для выхода используйте

exit

 

Установите последнюю версию PostgreSQL:

apt-get install postgresql

 

На всякий случай обновите систему:

apt-get update
apt-get upgrade

 

Кластеры

Внимание!!!

С этого момента в Debian работают два кластера PostgreSQL :

  • СТАРЫЙ кластер (/etc/postgresql/11/main/postgresql.conf) работает на порту 5432
  • НОВЫЙ кластер (/etc/postgresql/14/main/postgresql.conf) работает на порту 5433
Два кластера - два порта - 5432 и 5433 - PostgreSQL
Два кластера — два порта — 5432 и 5433 — PostgreSQL

Свежий конфигурационный файл «postgresql.conf» для 14 версии получает порт 5433. Это значит, что при активации 14 версии его нужно будет поправить на 5432. Если этого не сделать, то могут отвалиться подключения.

В операционной системе на одном порту может работать только один процесс. Разными портами разделяются кластеры. В результате разные версии СУБД могут иметь разные наборы баз данных. Но в нашем случае этого нет и мы просто хотим обновить СУБД на свежую версию со старыми базами.

 

Останавливаем сервер СУБД

systemctl stop postgresql

 

Обновление PostgreSQL до версии 14

Первое, что необходимо знать — это пути до системных каталогов:

  • /etc/postgresql
  • /var/lib/postgresql
  • /usr/lib/postgresql

В этих каталогах хранятся все необходимые конфигурационные файлы и серверные приложения PostgreSQL.

Если вы под root пользователем, то смените его на пользователя postgres:

su - postgres

После этого вызовите команду обновления версии СУБД:

/usr/lib/postgresql/14/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/11/main \
--new-datadir=/var/lib/postgresql/14/main \
--old-bindir=/usr/lib/postgresql/11/bin \
--new-bindir=/usr/lib/postgresql/14/bin \
--old-options '-c config_file=/etc/postgresql/11/main/postgresql.conf' \
--new-options '-c config_file=/etc/postgresql/14/main/postgresql.conf'

 

Если процесс пойдёт не по плану и вы увидите надпись «Видимо, запущен процесс postmaster, обслуживающий старый кластер.«, тогда принудительно остановите процессы postmaster:

/usr/lib/postgresql/11/bin/pg_ctl stop --pgdata=/var/lib/postgresql/11/main --mode=fast
/usr/lib/postgresql/14/bin/pg_ctl stop --pgdata=/var/lib/postgresql/14/main --mode=fast

(потом можете повторить предыдущий шаг)

 

Если процесс пойдёт не по плану и в этот раз, тогда проблема может быть в файле «pg_hba.conf» из директорий «/etc/postgresql/11/main» и «/etc/postgresql/14/main» соответственно. В 14 версии шифрование идёт через scram-sha-256 по умолчанию. В 11 версии используется md5.

Два метода аутентификации md5 и scram-sha-256 в PostgreSQL 11 и 14 версии - файл pg_hba.conf
Два метода аутентификации md5 и scram-sha-256 в PostgreSQL 11 и 14 версии — файл pg_hba.conf

Эта настройка влияет на то, как будут преобразованы прилетающие в СУБД пароли пользователей. Разные методы аутентификации будут выдавать разные итоговые значения при преобразования оригиналов паролей. Нужно просто исправить в файле для новой версии метод аутентификации на md5. После этого коннекты к СУБД наладятся.

 

Если в процессе обновления появятся ещё какие-то проблемы, тогда изучайте содержимое файла «pg_upgrade_server.log» из директории «/var/lib/postgresql«.

 

Стартуем новый кластер 14 версии и процесс postmaster

/usr/lib/postgresql/14/bin/pg_ctl start --pgdata=/etc/postgresql/14/main
Успешно запустили новый кластер с 14 версией PostgreSQL в Debian на порту 5432
Успешно запустили новый кластер с 14 версией PostgreSQL в Debian на порту 5432

Напоминаю, что к этому моменту новый кластер должен работать на порту 5432.

 

Запускаем сервер СУБД

systemctl start postgresql

 

Проверка состояний активности версий

Под postgres:

/usr/lib/postgresql/11/bin/pg_ctl status --pgdata=/var/lib/postgresql/11/main
/usr/lib/postgresql/14/bin/pg_ctl status --pgdata=/var/lib/postgresql/14/main

В нашем случае должен быть активным 14 кластер.

Активный postmaster у 14 версии PostgreSQL в Debian
Активный postmaster у 14 версии PostgreSQL в Debian

 

Проверка версии сервера PostgreSQL из самой СУБД

SQL-команда:

SHOW server_version;
Команда SHOW server_version - PostgreSQL
Команда SHOW server_version — PostgreSQL

 

Удаление старого кластера

После успешного обновления можно удалить старую версию кластера из ОС.

./delete_old_cluster.sh

 

Перенос статистики оптимизатора запросов на новый кластер со старого

/usr/lib/postgresql/14/bin/vacuumdb --all --analyze-in-stages

 

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Серверное приложение pg_upgradehttps://postgrespro.ru/docs/postgresql/14/pgupgrade

Серверное приложение pg_ctlhttps://postgrespro.ru/docs/postgresql/14/app-pg-ctl