Смена основной версии PostgreSQL

Материал из ISPWiki
Перейти к: навигация, поиск

Все описанное в статье требуется делать с полным пониманием тех действий, которые вы совершаете, необходимо обладать определенными навыками системного администрирования.

Обязательно перед всеми проводимыми работами необходимо сделать копию всех баз данных сервера. Рассмотрим пример изменения версии с 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

После проведенных работ следует проверить работоспособность сервера, в случае отсутствия БД загрузить резервную копию.