Я тестирую обновление 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статус выхода? Я полагаю, когда он установлен, работа сделана.