Обновление PostgreSQL

Просмотры: 917
Категория: Администрирование
Создано: 22 ноября 2020
Тэги: PostgreSQL CentOS

Как и любой программный продукт, СУБД PostgreSQL каждой версии имеет ограниченный срок поддержки. Так, на момент написания статьи, заканчивается поддержка версии 9.5 и производитель настоятельно рекомендует перейти на более актуальные версии. Также часто встречается ситуация, когда для разворачивания на сервере какого-то ПО необходима PostgreSQL не ниже определённой версии. Например, сейчас CMS Moodle (последняя версия 3.10) требует PostgreSQL не ниже версии 9.6. Однако, популярная сегодня ОС для сервера CentOS 7 "из коробки" предоставляет PostgreSQL только версии 9.2. В этой статье я опишу простой способ перевода СУБД PostgreSQL на актуальную версию для случая CentOS 7. Для других ОС данный рецепт тоже можно применять с небольшими косметическими изменениями.

Итак, пусть на сервере установлена PostgreSQL 9.6. Исполняемые файлы находятся в каталоге /usr/pgsql-96/bin/. Данные расположены в каталоге /var/lib/pgsql/96/data/. Установим последнюю на текущий момент PostgreSQL версии 13.1 и перенесем все данные. Для этого сначала установим соответствующий репозиторий (для RedHat Enterprise, CentOS, Scientific или Oracle версии 7)

sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Теперь устанавливаем сам сервер 13-й версии

sudo yum install -y postgresql13-server

Инициализируем базы данных

sudo /usr/pgsql-13/bin/postgresql-13-setup initdb

Теперь займемся переносом данных из БД версии 9.6 в БД версии 13.1. Новые данные будут располагаться в каталоге /var/lib/pgsql/13/data/. Но сначала нужно прописать все разрешения для пользователя postgres в файле pg_hba.conf . Новый файл находится в том же каталоге, где и сами данные: /var/lib/pgsql/13/data/ . Перелогиниваемся в postgres

sudo su - postgres

и правим файл pg_hba.conf в соответствующем каталоге: даем нужные полномочия для postgres. Теперь нужно остановить сервер PostgreSQL (делаем это из-под пользователя, которому разрешена команда sudo):

sudo systemctl stop postgresql-96

Переносим данные (из-под postgres):

/usr/pgsql-13/bin/pg_upgrade --old-datadir /var/lib/pgsql/96/data --new-datadir /var/lib/pgsql/13/data --old-bindir /usr/pgsql-96/bin --new-bindir /usr/pgsql-13/bin

При запуске pg_upgrade проверит на совместимость обе директории и если не будет ошибок, перенесет данные. Если появляются ошибки, читаем внимательно то, что пишет pg_upgrade и исправляем нужные файлы. Часто причиной ошибок является неправильные разрешения для postgres в pg_hba.

После переноса запускаем новый сервер:

sudo systemctl start postgresql-13

Проверяем его на работоспособность, на наличие и самое главное на отсутствие ошибок. Старый сервер выводим из автозапуска:

sudo systemctl disable postgresql-96

Новый добавляем в автозапуск

sudo systemctl enable postgresql-13

Если убедились, что новый сервер работает хорошо, можно удалить старый кластер (из-под postgres):

/var/lib/pgsql/9.6/data/delete_old_cluster.sh

или просто (это содержимое файла со скриптом):

rm -rf '/var/lib/pgsql/9.6/data'

Переход на новый сервер PostgreSQL завершен. Не забываем отредактировать pg_hba.conf или восстановить его старую версию.

UPD: Если PostgreSQL ставился из исходников в /usr/local/pgsql, тогда поступаем следующим образом. Сначала останавливаем сервер

sudo systemctl stop postgresql

Распаковываем архив и компилиуем (обязательно с параметром --with-systemd)

tar xjvf postgresql-13.1.tar.bz2

cd postgresql-13.1

./configure --prefix=/usr/local/pgsql --with-icu --with-systemd

make

ОБЯЗАТЕЛЬНО!!! Переименовываем каталог со старым сервером

sudo mv /usr/local/pgsql{,.old}

Теперь инсталлируем новый сервер

make install

Добавляем каталог для данных и меняем его владельца

sudo mkdir /usr/local/pgsql/data

sudo chown postgres /usr/local/pgsql/data

Инициализируем новую базу

sudo su - postgres

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

Восстанавливаем старый конфигурационный файл

cp /usr/local/pgsql.old/data/pg_hba.conf /usr/local/pgsql/data/pg_hba.conf

Выходим из postgres и запускаем сервер

sudo systemctl start postgresql

Старые данные удаляем

sudo rm -rf /usr/local/pgsql.old