Прикладная демонология, практические рецепты

Обновление PostgreSQL

Как известно, при обновлении между версиями PostgreSQL может меняться структура данных на диске. Поэтому необходимо либо выполнить полный цикл dump/restore, либо воспользоваться утилитой pg_upgrade. Второй вариант может оказаться на порядки быстрее, но с его применением есть нюанс: в один момент времени необходимо иметь в системе две установленные версии PostgreSQL (старую и новую), что может вызвать затруднения при работе с пакетным менеджером.

Ниже рассматривается последовательнось шагов при обновлении между версиями 9.4 и 9.5.

Очень желательно заранее проверить версии установленных расширений и, при необходимости, обновить их:

select * from pg_available_extensions where default_version <> installed_version;
alter extension ... update;

Подготавливаем резервные копии старых (установленных пакетов):

cd ~ && pkg create postgresql94-client postgresql94-contrib postgresql94-server

Сохраним все текущие установленные файлы пакетов во временную иерархию:

rm -rf /var/tmp/pgsql94 && mkdir /var/tmp/pgsql94 && pkg info -ql postgresql94-client postgresql94-contrib postgresql94-server | tar -cf- --files-from=- | tar -xpf - -C /var/tmp/pgsql94

Выполним форсированный checkpoint (для ускорения последующего shutdown):

psql -U pgsql -ccheckpoint template1

Выполняем shutdown (начало downtime):

service postgresql stop

Удаляем старую версию и устанавливаем новую:

pkg delete -y postgresql94-client postgresql94-contrib postgresql94-server
pkg install -y postgresql95-client postgresql95-contrib postgresql95-server

Временно сохраним старый каталог с данными:

mv /var/db/pgsql /var/db/pgsql94

Создаем новый каталог базы данных и инициализируем его:

mkdir -m0700 /var/db/pgsql && chown pgsql:pgsql /var/db/pgsql
service postgresql initdb

Выполняем непосредственно pg_upgrade:

cd /var/tmp && time su -m pgsql -c 'pg_upgrade -b /var/tmp/pgsql94/usr/local/bin -B /usr/local/bin -d /var/db/pgsql94 -D /var/db/pgsql -k'

Копируем конфигурацию из старого каталога базы:

cp -p /var/db/pgsql94/postgresql.conf /var/db/pgsql94/pg_hba.conf /var/db/pgsql

Запускаем сервер (конец downtime):

service postgresql start

Выполняем минимальный сбор статистики:

vacuumdb -U pgsql --all --analyze-in-stages

Удаляем старый каталог базы:

rm -rf /var/db/pgsql94