Я тестирую обновление PostgreSQL с 8.2.1 до 9.2 на виртуальной машине, работающей под управлением специального дистрибутива Linux. Процедура обновления выглядит следующим образом:
- Запустить
pg
сервис - Вакуумные все БД (не уверен, если это необходимо)
- Резервное копирование с
pg_dumpall
- Остановить
pg
службу - Уберите каталог, в котором хранятся данные (
/var/pg
это простая настройка для одного сервера) - Установите PostgreSQL 9.2
initdb
- Запустите сервер
- Восстановить сброшенные данные
reindexdb
все БД- Воссоздать
referential_constraints
вид - Очистить все базы данных (AFAIK требуется после этого обновления)
Эта процедура прекрасно работает на одном хосте, резервное копирование и восстановление без помех. На другом компьютере с другой базой данных точки с 1 по 7 работают нормально, но сервер не запустится, пока я не добавлю sleep 1
после initdb
, и даже тогда сброшенные данные не могут быть восстановлены, потому что «система базы данных запускается ». Каковы стандартные способы борьбы с этим, кроме этих ужасных хаков:
sleep
в течение некоторого времени перед любой операцией,- цикл до тех пор, пока он не сработает, или пока не будет достигнут щедрый таймаут, или
- цикл до тех пор, пока он не примет тривиальный запрос или не истечет время ожидания.
Изменить: « Решение » не сработало в конце концов. Что нужно для того, чтобы база данных была готова к восстановлению?
initdb
выполняется синхронно, поэтому, когда сервер запущен, initdb
он уже успешно завершен.
initdb
статус выхода? Я полагаю, когда он установлен, работа сделана.