LINUX.ORG.RU
ФорумAdmin

Запуск Postgresql 9.4 на Debian 8 после незапланированного отключения

 , ,


0

3

Вопрос рабочий, не праздный. Поэтому могу заплатить за консультацию.

У клиента машина, на машине VirtualBox, в нём Debian 8 с intranet-приложением (nginx+php+postgres), без подключения к Глобальной Сети (т.е. обновляю вручную, путём подмены виртуальных дисков, без замены диска с самими клиентскими данными)

То у него электричество отключают, то сам свою машину убивает - время от времени машинка неожиданно схлопывается вместе с виртуалкой.

Года два так оно и работало. Само поднималось. А последние пару месяцев Postgres перестал стартовать после таких сбоев. (Скорее всего, это может быть связанно с выросшим объёмом данных - не успевает теперь подняться и проверить всё, до того как systemd решит, что Postgres скис (мне так кажется))
Просто молчит.
Еду ногами к клиенту и запускаю руками /usr/lib/postgresql/9.4/bin/pg_ctl -D [путь] stop и (*) start - руками запускается. Через service start\stop - нет.

Поднадоело. И людям дискомфортно, и самому как на иголках.

Указывал в конфиге pg_ctl_option = '-w' (чтобы ожидало старта) - не помогает.

Самое непонятное - не могу повторить это поведение у себя на рабочей машине. У меня в любом случае нормальный старт - хоть из розетки выключай. Тот же VBox, тот же Debian и остальное - всё одинаковое (кроме самих данных). Получается, что у себя проблему не вижу, а у людей сидеть долго не могу, потому что эта машинка занята человеками.

У того же клиента рядом стоит железная машина cо старой AstraLinux (на Debian 7) - она тоже нормально стартует после неожиданных отключений.

Переехать в нормальный ДЦ не хотят (не могут), выделить средства на еще одну железную машинку тоже не хотят (не могут).

Это должно быть что-то про таймауты/systemd/ожидание/перезапуск/чистка хвостов от прошлого запуска. Как правильно сконфигурировать запуск Postgres, подразумевая возможные нештатные остановки?

Deleted
echo PGCTLTIMEOUT=120 > /etc/postgresql/9.4/main/environment
redgremlin ★★★★★
()

и запускаю руками /usr/lib/postgresql/9.4/bin/pg_ctl -D [путь] stop и (*) start - руками запускается. Через service start\stop - нет.

А что в логах? После неуспешного запуска через service?

Самое непонятное - не могу повторить это поведение у себя на рабочей машине. У меня в любом случае нормальный старт - хоть из розетки выключай. Тот же VBox, тот же Debian и остальное - всё одинаковое (кроме самих данных).

Это очень похоже на порчу таблиц базы при внезапном отключении. У себя не можете воспроизвести, потому что нагрузки на базу нет в момент отключения. Логи смотреть надо, там должна быть причина.

Serge10 ★★★★★
()
Ответ на: комментарий от Serge10

Не могу сказать точно про логи. Примерно так: или «идёт запуск сервера, ждите», или «идёт остановка сервера, ждите». Больше ничего не происходит. На моей машине минут через 5-10 начинает отвечать с обычным логом. На клиентской - говорят ждали три часа без толку, пока не приехал.

Когда сидел за той машиной, и мог точно видеть что там написано - выгуглил по этой фразе где-то в Сети рекомендации про старт с "-w" (правда для Ubuntu). Но не помогло, как выясняется.

Вариант товарища redgremlin спасибо, попробую, когда следующий раз оказия будет там.

Deleted
()

А зачем вам systemd там? Он одной командой удаляется: apt-get install -y sysvinit-core, и не будет таких проблем с timeout запуска.

anonymous
()
Ответ на: комментарий от Deleted

Вообще-то, при внезапной пропаже питания возможна порча лога транзакций (научное название: WAL - журнал упреждающей записи) PostgreSQL с пропажей последних изменений и нежеланием PostgreSQL запускаться. Для борьбы с этим применяют резервное копирование базы, включая файлов лога транзакций, для чего есть специальные программы. Подробности в документации по PostgreSQL, а также есть форум на русском языке.

Partisan ★★★★★
()
Ответ на: комментарий от Partisan

Спасибо.
Хочется верить я не настолько плох, как вы думаете.
Конечно, и бэкапы, и на другой физический носитель, и разные уровни подробностей для ежедневного, еженедельного, ежемесячного. И уже успело пригодиться.

Речь была именно о таймаутах, при условии отсутствия неисправимых ошибок данных.

Что-то вокруг этого:

Consider carefully the timeout setting. systemd has a default timeout of 90 seconds as of this writing and will kill a process that does not notify readiness within that time. But a PostgreSQL server that might have to perform crash recovery at startup could take much longer to become ready. The suggested value of 0 disables the timeout logic.

https://www.postgresql.org/docs/10/static/server-start.html

или этого: http://charlesnagy.info/it/postgresql/postgresql-server-fails-to-start-in-rec...

К сожалению точно недостаточно хорош, чтобы понять решение, не имея возможности его быстро протестировать на проблеме.

Deleted
()
Ответ на: комментарий от Partisan

Вообще-то, при внезапной пропаже питания возможна порча лога транзакций (научное название: WAL - журнал упреждающей записи) PostgreSQL с пропажей последних изменений и нежеланием PostgreSQL запускаться.

Вообще-то, если при внезапной пропаже питания действительно происходит порча лога транзакций, то это только одно из двух:

  • Неисправное железо.
  • Неправильно настроен PostgreSQL или OS.

Just FYI.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.