Обновление PostgreSQL (FreeBSD)

Иногда приходится обновлять PostgreSQL, прогресс не стоит не месте. При обновлении с версии X.Y.Z на X.Y.Z+ всё предельно просто — portupgrade и никаких проблем. При обновлении с X.Y.* на X.Y+.* всё чуть-чуть сложнее...

...итак, краткий план действий:

  1. обновляем PostgreSQL-клиент;
  2. используя новый клиент, создаём дамп данных из старой БД;
  3. останавливаем PostgreSQL-сервер;
  4. обновляем PostgreSQL-сервер;
  5. выполняем initdb для сервера;
  6. загружаем базу данных;
  7. выполняем vacuum analyse;

Обновление PostgreSQL-клиента

При обновлении минорной версии PostgreSQL необходимо сделать дамп БД и загрузить его новым PostgreSQL-клиентом. Почему? Потому что новый клиент знает формат нового сервера, старый может быть не в курсе нововведений.

Обновляем порты — portsnap или csup:

portsnap fetch && portsnap update

или

csup ports-supfile && cd /usr/ports && make index

Обновляем при помощи portupgrade только клиента PostgreSQL:

portupgrade -fo databases/postgresql84-client postgresql-client

Ключик -f нужен... на всякий случай, мало ли что ;)

Производим новым клиентом дамп старых данных, pg_dumpall для сохранения всего, что есть в сервере:

pg_dumpall > dumpall.sql

Останавливаем сервер PostgreSQL:

/usr/local/etc/rc.d/postgresql stop

Обновляем сервер PostgreSQL:

portupgrade -fo databases/postgresql84-server postgresql-server

Возможно, понадобится ещё и это:

portupgrade postgresql-contrib

initdb — инициализируем БД

На всякий случай, перед тем как запускать initdb, лучше скопировать старый каталог с данными PostgreSQL в укромненькое местечко — мало ли, что может произойти, надо иметь пути к отступлению даунгрейду.

Так же, полезно сохранять конфигурационные файлы (postgresql.conf, pg_hba.conf etc).

cd /usr/local/pgsql
mv data data.8.3.9

Запускаем initdb:

/usr/local/etc/rc.d/postgresql initdb

(Возможно, надо подправить /usr/local/pgsql/data/postgresql.conf в случае наличия каких-либо особых настроек для предыдущей версии.)

Запуск сервера и загрузка дампа БД

Запускаем сервер PostgreSQL:

/usr/local/etc/rc.d/postgresql start

Загружаем данные:

su pgsql
psql template1 < dumpall.sql

vacuum analyse

Выполнение vacuum analyse заставляет PostgreSQL обновить внутреннюю статистику, используемую для планирования запросов, это необходимо всегда производить после загрузки дампа БД.

$ psql regress
psql (8.4.2)
Type "help" for help.

regress=# vacuum analyse;