Обязательно перед всеми проводимыми работами необходимо сделать копию всех баз данных сервера.
Пример изменения версии с PostgreSQL 9.2 до PostgreSQL 9.3 на Centos 7 и на Debian 8 пример изменения версии с 9.4 до 9.5
Centos 7 PostgreSQL 9.3
Устанавливаем репозиторий. Репозиторий с необходимой версией вы можете найти на http://yum.postgresql.org
wget https://download.postgresql.org/pub/repos/yum/9.3/redhat/rhel-7-x86_64/pgdg-centos93-9.3-3.noarch.rpm
rpm -ivh ./pgdg-centos93-9.3-3.noarch.rpm
Смотрим, какие пакеты postgresql установлены:
rpm -qa | grep postgresql
postgresql-server-9.2.15-1.el7_2.x86_64
postgresql-libs-9.2.15-1.el7_2.x86_64
postgresql-9.2.15-1.el7_2.x86_64
Устанавливаем такие же пакеты версии 9.3 и пакет contrib
yum install postgresql93-server.x86_64 postgresql93-libs.x86_64 postgresql93.x86_64 postgresql93-contrib.x86_64
В файле /usr/lib/systemd/system/postgresql-9.3.service указываем порт, отличный от стандартного, например PGPORT=5432 Проверьте, что PGDATA отличается от /var/lib/pgsql/data/, например PGDATA=/var/lib/pgsql/9.3/data/ Инициализируем 9.3 Postgresql
/usr/pgsql-9.3/bin/postgresql93-setup initdb
Проверяем, что директория /var/lib/pgsql/9.3/data/ и файлы в ней созданы. Останавливаем сервер postgresql
service postgresql stop
Необходимо запустить утилиту pg_upgrade. Опции утилиты:
- -b бинарная директория старой версии postgresql
- -B бинарная директория новой версии postgresql
- -d директория с данными старой версии postgresql
- -D директория с данными новой версии postgresql
Запускаем pg_upgrade
su postgres
cd /var/lib/pgsql/9.3/
/usr/pgsql-9.3/bin/pg_upgrade -v -b /usr/bin/ -B /usr/pgsql-9.3/bin/ -d /var/lib/pgsql/data/ -D /var/lib/pgsql/9.3/data/
Возможные проблемы:
*failure*
There were problems executing ""/usr/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "/var/lib/pgsql/data/" -o "-p 50432 -b
-c listen_addresses= - c unix_socket_permissions=0700 -c unix_socket_directory='/var/lib/pgsql/9.3/data'" start >> "pg_upgrade_server.log" 2>&1"
Consult the last few lines of "pg_upgrade_server.log" for
the probable cause of the failure.
В логе pg_upgrade_server.log при этом следующие ошибки:
command: "/usr/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "/var/lib/pgsql/data/" -o "-p 50432 -b -c listen_addresses= -c
unix_socket_permissions=0700 -c unix_socket_directory='/var/lib/pgsql/9.3/data'" start >> "pg_upgrade_server.log" 2>&1
waiting for server to start....FATAL: unrecognized configuration parameter "unix_socket_directory"
stopped waiting
pg_ctl: could not start server
Examine the log output.
Под пользователем root выполняем следующие команды:
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
connection to database failed: FATAL: no pg_hba.conf entry for host "[local]", user "postgres", database "template1", SSL off
Для решения проблемы необходимо добавить в /var/lib/pgsql/data/pg_hba.conf строку:
local all all trust
Сравниваем конфигурационный файл старого сервера с новым.
diff /var/lib/pgsql/data/pg_hba.conf ./pg_hba.conf
Если необходимо, копируем конфигурационный файл pg_hba.conf
cp /var/lib/pgsql/data/pg_hba.conf ./pg_hba.conf
Меняем порт на порт по умолчанию в /usr/lib/systemd/system/postgresql-9.3.service PGPORT=5432 Запускаем новый сервер
service postgresql-9.3 start
Запускаем analyze_new_cluster.sh
su postgres
/var/lib/pgsql/9.3/analyze_new_cluster.sh
Запускаем, delete_old_cluster.sh, чтобы удалить директорию старого сервера. Все базы данных будут удалены
/var/lib/pgsql/9.3/delete_old_cluster.sh
Копируем содержимое новой директории в рабочую директорию сервера.
cp -R /var/lib/pgsql/9.3/data /var/lib/pgsql/
chown -R postgres:postgres /var/lib/pgsql/data
в /usr/lib/systemd/system/postgresql-9.3.service меняем PGDATA на /var/lib/pgsql/data/ Перезапускаем
service postgresql-9.3 restart
Удаляем старый сервер
yum remove postgresql-server-9.2.15-1.el7_2.x86_64 postgresql-9.2.15-1.el7_2.x86_64 postgresql-libs-9.2.15-1.el7_2.x86_64
Запускаем скрипт со следующим содержимым:
ls /usr/pgsql-9.3/bin/ |while read line
do
ln -s /usr/pgsql-9.3/bin/$line /usr/bin/$line
done
В файле /var/lib/pgsql/.bash_profile меняем версию на 9.3 После проведенных работ следует загрузить существующую резервную копию БД и проверить работоспособность сервера.
Debian 8 PostgreSQL 9.5
Подключаем репозиторий с другими версиями postgresql В файл /etc/apt/sources.list добавляем строки
# PostgreSQL repository
deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main
Импортируем ключ для репозитория
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
Обновим пакеты:
apt-get update -y
Проверяем наличие версий PostgreSQL
apt-cache search postgresql- | less
Устанавливаем версию 9.5 PostgreSQL
apt-get install postgresql-9.5 -y
Удаляем новую версию кластера:
pg_dropcluster --stop 9.5 main
С помощью скрипта pg_upgradecluster производим апгрейд до новой мажорной версии, конфигурационные файлы и данные будут скопированы в новый кластер.
pg_upgradecluster -v 9.5 9.4 main
При апгрейде возможны проблемы:
psql: FATAL: no pg_hba.conf entry for host "[local]", user "postgres", database "template1", SSL off
psql: FATAL: no pg_hba.conf entry for host "[local]", user "postgres", database "template1", SSL off
Use of uninitialized value $out in pattern match (m//) at /usr/share/perl5/PgCommon.pm line 915.
psql: FATAL: no pg_hba.conf entry for host "[local]", user "postgres", database "template1", SSL off
Use of uninitialized value $out in pattern match (m//) at /usr/share/perl5/PgCommon.pm line 921.
Use of uninitialized value $ctype in scalar chomp at /usr/share/perl5/PgCommon.pm line 924.
Use of uninitialized value $collate in scalar chomp at /usr/share/perl5/PgCommon.pm line 925.
Error: could not get cluster locales
Следует добавить в /etc/postgresql/9.4/main/pg_hba.conf строку
local all all trust
После апгрейда удаляем эту строку из /etc/postgresql/9.5/main/pg_hba.conf Удаляем старый сервер, все базы данных будут удалены:
pg_dropcluster --stop 9.4 main
После проведенных работ следует проверить работоспособность сервера, в случае отсутствия БД загрузить резервную копию.
С подробной информацией можно ознакомится на официальном сайте разработчика.