Обновление PostgreSQL
- Просмотры: 917
- Категория: Администрирование
- Создано: 22 ноября 2020
- Тэги:
Как и любой программный продукт, СУБД 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