Обновление 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