Возникла у меня на днях задача по обновлению 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/), где можно найти почти все версии (в том числе и ту, что меня интересует).
Как только все нужные пакеты скачаны, можно воспользоваться общедоступными инструкциями по обновлению, например:
- Upgrade postgresql 9.2 to 9.6 in CentOS 7 (bold steps) (именно её я и взял за основу)
- CentOS: Upgrade PostgreSQL from 9.2 to 9.6
Установка 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
Комментариев нет:
Отправить комментарий