четверг, 10 июня 2010 г.

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

P.S.

Всё, что выше — является весьма вольным переводом вот этого.