Иногда приходится обновлять PostgreSQL
, прогресс не стоит не месте.
При обновлении с версии X.Y.Z на X.Y.Z+ всё предельно просто — portupgrade
и никаких проблем.
При обновлении с X.Y.* на X.Y+.* всё чуть-чуть сложнее...
...итак, краткий план действий:
- обновляем
PostgreSQL
-клиент; - используя новый клиент, создаём дамп данных из старой БД;
- останавливаем
PostgreSQL
-сервер; - обновляем
PostgreSQL
-сервер; - выполняем
initdb
для сервера; - загружаем базу данных;
- выполняем
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;