Я тестирую обновление 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
в течение некоторого времени перед любой операцией,- цикл до тех пор, пока он не сработает, или пока не будет достигнут щедрый таймаут, или
- цикл до тех пор, пока он не примет тривиальный запрос или не истечет время ожидания.
Изменить: « Решение » не сработало в конце концов. Что нужно для того, чтобы база данных была готова к восстановлению?
postgresql
restore
upgrade
l0b0
источник
источник
initdb
статус выхода? Я полагаю, когда он установлен, работа сделана.initdb
выполняется синхронно, поэтому, когда сервер запущен,initdb
он уже успешно завершен.Ответы:
initdb не возвращается, пока не закончится, поэтому не должно быть никакой паузы между ним и запуском сервера. В PostgreSQL были ошибки, когда он завершался без предварительной записи всего на диск. Я не знаю ни одного левого в данный момент, но природа ошибок заключается в том, что вы не всегда знаете о них.
Если вы используете команду pg_ctl для запуска базы данных, используйте параметры "-w", чтобы дождаться завершения запуска перед возвратом. Он не делает ничего особенного - он просто "готов?" петля для вас.
Обратите внимание, что если вы получаете сбой сервера с большим количеством данных, которые необходимо воспроизвести перед запуском сервера, время ожидания, установленное параметром -t в ожидании pg_ctl, может быть слишком низким.
Нет никаких оснований для VACUUM исходных баз данных перед выполнением их pg_dump. Хотя это может немного ускорить сброс, сам вакуум займет больше времени, чем это улучшение.
источник
pg_restore -j
{morethan1}).postmaster
чтобы запустить демона, и у него нет такой возможности.за работойНеисправным решением было модифицировать сценарий инициализации, чтобы повторно проверять, используется ли соответствующий порт. Если он не появляется через минуту, запуск считается сбойным. Псевдо-код:Edit: оказывается , что это не достаточно. Шаг восстановления:
Сообщение об ошибке:
источник