воскресенье, 14 апреля 2024 г.

Обновление сервера PostgreSQL с 9.2 до 9.5 в CentOS 7

Возникла у меня на днях задача по обновлению PostgreSQL древней версии 9.2.4 на не менее древнюю 9.5 на CentOS7.

Исходные данные:

# uname --all
Linux centos7 3.10.0-1160.95.1.el7.x86_64 #1 SMP Mon Jul 24 13:59:37 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
# psql --version
psql (PostgreSQL) 9.2.24
Поверхностным поиском в интернетах можно найти лишь антикварные инструкции (пример), работоспособность которых под большим вопросом (в основном из-за битых ссылок).
На официальном сайте всё, что старше 12-ой версии, отправили в утиль, и в веб-архиве хвостов не сохранилось.
Якобы ещё есть полуофициальный способ установки через SCL, но он мне не приглянулся, поэтому я отложил его на потом.
Сначала я думал, что эта задача принципиально нерешаема "стандартным способом", однако вскоре мне попалось зеркало пакетов в Huawei Cloud (https://mirrors.huaweicloud.com/postgresql/repos/yum/), где можно найти почти все версии (в том числе и ту, что меня интересует).
Как только все нужные пакеты скачаны, можно воспользоваться общедоступными инструкциями по обновлению, например:

Установка PostgreSQL 9.5

Устанавливаем все скачанные RPM, начиная с postgresql95-libs-9.5.24-1PGDG.rhel7.x86_64.rpm.
В моём случае на втором же пакете postgresql95-9.5.24-1PGDG.rhel7.x86_64.rpm выскочили предупреждения о конфликте имён, т.к. обе версии (и 9.2, и 9.5) хранят бинарники в одном месте. Недолго думая, я снёс PostgreSQL 9.2 (через yum), и после этого все пакеты версии 9.5 (начиная я проблемного) установил заново. Из-за этого далее возникли проблемы, и этот эпизод по-хорошему надо как-то корректно обыграть... Как минимум надо вновь установить старую версию.
Инициализируем базу новой версии:
/usr/pgsql-9.5/bin/postgresql95-setup initdb
А теперь ключевой момент - трюк с pg_ctl, который нужен исключительно ради upgrade:
mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

Обновление данных

Останавливаем оба сервера:
systemctl stop postgresql
От имени пользователя postgres запускаем миграцию базы:
su postgres
cd ~
/usr/pgsql-9.5/bin/pg_upgrade -v -b /usr/bin/ -B /usr/pgsql-9.5/bin/ -d /var/lib/pgsql/data/ -D /var/lib/pgsql/9.5/data/
exit
Вернувшись в root-shell, удаляем трюк с pg_ctl:
mv -f /usr/bin/pg_ctl{-orig,}
Далее надо применить те же настройки к файлам pg_hba.conf и postgresql.conf (они находятся в каталоге /var/lib/pgsql/9.5/data), которые были указаны для старой версии в соответствующих файлах (они находятся в каталоге /var/lib/pgsql/data).

Запускаем новый сервер

Перенастраиваем сервисы:
systemctl start postgresql-9.5
systemctl enable postgresql-9.5
systemctl disable postgresql
Временные ссылки (похоже, они нужны только для проверки базы на следующем шаге):
ln -s /usr/pgsql-9.5/bin/psql /usr/bin/psql --force
ln -s /usr/pgsql-9.5/bin/pg_dump /usr/bin/pg_dump --force
Проверка новой базы (от имени пользователя postgres):
su postgres
cd ~
./analyze_new_cluster.sh
exit
Удаляем старую версию сервера (от пользователя root):
yum remove postgresql
Обновляем путь:
echo 'export PATH=$PATH:/usr/pgsql-9.5/bin' >> /etc/bashrc

Завершение

Минимальная проверка, что всё срослось:
[root@localhost ~]# postgres -V
postgres (PostgreSQL) 9.5.24
Впоследствии старые данные можно удалить (от имени пользователя postgres):
./delete_old_cluster.sh
Ссылки в тему:

Комментариев нет:

Отправить комментарий