LINUX.ORG.RU
ФорумAdmin

Перезапуск postgresql

 ,


0

1

Всем привет. Расследую небольшой инцидент, выразившийся в незапуске postgresql после ребута сервера, вижу в логе:

Mar 26 06:49:07 mail postgres[1396]: [1-1] 2019-03-26 06:49:07.477 +04 [1396] СООБЩЕНИЕ:  завершение вывода в stderr
Mar 26 06:49:07 mail postgres[1396]: [1-2] 2019-03-26 06:49:07.477 +04 [1396] ПОДСКАЗКА:  В дальнейшем протокол будет выводиться в "syslog".
Mar 26 06:49:07 mail postgres[1616]: [2-1] 2019-03-26 06:49:07.538 +04 [1616] СООБЩЕНИЕ:  работа системы БД была прервана; последний момент работы: 2019-03-26 06:43:50 +04
Mar 26 06:49:07 mail postgres[1617]: [2-1] 2019-03-26 06:49:07.539 +04 [1617] [н/д]@[н/д] СООБЩЕНИЕ:  неполный стартовый пакет
Mar 26 06:49:12 mail postgres[1396]: [2-1] 2019-03-26 06:49:12.849 +04 [1396] СООБЩЕНИЕ:  получен запрос на "вежливое" выключение
Mar 26 06:49:22 mail postgres[1616]: [3-1] 2019-03-26 06:49:22.068 +04 [1616] СООБЩЕНИЕ:  система БД была остановлена нештатно; производится автоматическое восстановление
Mar 26 06:49:22 mail postgres[1616]: [4-1] 2019-03-26 06:49:22.254 +04 [1616] СООБЩЕНИЕ:  неверная длина записи по смещению 1/9BFE0AC0: ожидалось 24, получено 0
Mar 26 06:49:22 mail postgres[1616]: [5-1] 2019-03-26 06:49:22.254 +04 [1616] СООБЩЕНИЕ:  данные REDO не требуются
Mar 26 06:49:22 mail postgres[1616]: [6-1] 2019-03-26 06:49:22.858 +04 [1616] СООБЩЕНИЕ:  Защита от зацикливания мультитранзакций сейчас включена
Mar 26 06:49:22 mail postgres[2071]: [3-1] 2019-03-26 06:49:22.866 +04 [2071] СООБЩЕНИЕ:  выключение
Mar 26 06:49:23 mail postgres[1396]: [3-1] 2019-03-26 06:49:23.591 +04 [1396] СООБЩЕНИЕ:  система БД выключена

Как вижу, процесс запуска был почему то остановлен. Судя по всему, процесс был остановлен «вежливо» с помощью systemd. Открываю postgresql.service и вижу:

[Service]
Type=oneshot
ExecStart=/bin/true
ExecReload=/bin/true

Не вижу установленного параметра Timeout, который предлагается использовать на сайте postgrespro:

Особого внимания заслуживает значение тайм-аута. 
На момент написания этой документации по умолчанию в systemd принят тайм-аут 90 секунд, так что процесс, не сообщивший о своей готовности за это время, будет уничтожен. 
Но серверу PostgreSQL при запуске может потребоваться выполнить восстановление после сбоя, так что переход в состояние готовности может занять гораздо больше времени.
Предлагаемое значение 0 отключает логику тайм-аута.

Однако этот параметр не требуется, если тип сервиса установлен в oneshot :

Disabled by default, when service with Type=oneshot is used. 

По какой же причине systemd перезапустила сервис?

Какая ось?

Если что-то дебианоподобное, то там шаблонный юнит. Такой, например:

systemctl cat postgresql@9.5-main.service 
# /lib/systemd/system/postgresql@.service
# systemd service template for PostgreSQL clusters. The actual instances will
# be called "postgresql@version-cluster", e.g. "postgresql@9.3-main". The
# variable %i expands to "version-cluster", %I expands to "version/cluster".
# (%I breaks for cluster names containing dashes.)

[Unit]
Description=PostgreSQL Cluster %i
ConditionPathExists=/etc/postgresql/%I/postgresql.conf
PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service
Before=postgresql.service

[Service]
Type=forking
# @: use "postgresql@%i" as process name
ExecStart=@/usr/bin/pg_ctlcluster postgresql@%i %i start
ExecStop=/usr/bin/pg_ctlcluster -m fast %i stop
ExecReload=/usr/bin/pg_ctlcluster %i reload
PIDFile=/var/run/postgresql/%i.pid
SyslogIdentifier=postgresql@%i
# restarting automatically will prevent "pg_ctlcluster ... stop" from working,
# so we disable it here. Also, the postmaster will restart by itself on most
# problems anyway, so it is questionable if one wants to enable external
# automatic restarts.
#Restart=on-failure
# (This should make pg_ctlcluster stop work, but doesn't:)
#RestartPreventExitStatus=SIGINT SIGTERM

[Install]
WantedBy=multi-user.target
Difrex ★★★★
()
Ответ на: комментарий от Difrex

ОС Debian. Да, юнит выглядит похоже, отличия в:

ExecStart=@/usr/bin/pg_ctlcluster postgresql@%i --skip-systemctl-redirect %i start
ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop
ExecReload=/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i reload

Aborigen1020
() автор топика

Надо тебе openrc или ещё какой нормальный init с управлением сервисом через скрипт использовать, чтобы ребусы системд не разгадывать.

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

Зато что написано, то и происходит, по этому можно не гадать, а просто понять написанное.

И может вся причина того что автор написал инит так в том что у него более мощный компьютер и таймаута по дефолту ему просто хватает?
А вот в скрипте эта проблема всплыла бы сразу.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)

type=oneshot определяет сервис недлительного действия, т.е. процесс запустился отработал и закончился.

сколь помню через какой-то таймаут сервис oneshot считает слишком долго работающим и вполне логично пристреливается системд.

«мне каатцо» что-то ты нарисовал не так. мож тебе тип на более подходящий для длительно работающей базы данных вписать ??

$ systemctl show ****.service показывает все переменные установленные для данного сервиса, в том числе и с дефолтными параметрами.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от torvn77

таймаута по дефолту ему просто хватает?

90 секунд достаточно, чтобы запуститься. По логам, процесс postgresql был пристрелен через 13 секунд после запуска. Лучше давайте гадать, в связи с чем.

Aborigen1020
() автор топика
Ответ на: комментарий от pfg

systemctl show postgresql.service

Глянул,

Type=oneshot
Restart=no
NotifyAccess=none
RestartUSec=100ms
TimeoutStartUSec=infinity
TimeoutStopUSec=1min 30s
RuntimeMaxUSec=infinity

мож тебе тип на более подходящий для длительно работающей базы данных вписать

так она и работает длительно. Не выключаясь. Это после ребута сервера postgresql не поднялся сам, вот и интересно, почему.

Aborigen1020
() автор топика
Ответ на: комментарий от targitaj

Но почему сообщения на русском языке

Есть и на забугорном. Не сильно информативнее.

Mar 26 06:49:23 mail systemd[1]: Failed to start PostgreSQL Cluster 9.6-main.
Mar 26 06:49:23 mail systemd[1]: postgresql@9.6-main.service: Unit entered failed state.
Mar 26 06:49:23 mail systemd[1]: postgresql@9.6-main.service: Failed with result 'exit-code'.
Mar 26 06:49:23 mail systemd[1]: Starting PostgreSQL RDBMS...
Mar 26 06:49:23 mail systemd[1]: Started PostgreSQL RDBMS. 
Aborigen1020
() автор топика
Ответ на: комментарий от targitaj

Лог чего? Постреса? Он в первом посте.

Вот момент, когда все случилось:

мар 26 06:49:12 mail postgres[2051]: [2-1] 2019-03-26 06:49:12.843 +04 [2051] postgres@postgres ВАЖНО:  система баз данных запускается
мар 26 06:49:12 mail postgresql@9.6-main[449]: The PostgreSQL server failed to start. Please check the log output.
мар 26 06:49:12 mail systemd[1]: postgresql@9.6-main.service: Control process exited, code=exited status=1
мар 26 06:49:12 mail postgres[1396]: [2-1] 2019-03-26 06:49:12.849 +04 [1396] СООБЩЕНИЕ:  получен запрос на "вежливое" выключение

Лог перенаправлен в syslog, Ничего более детального, чем в первом посте, нет.

Ну я поставил сейчас log_min_messages в notice, перечитал конфиг. Вдруг что в следующий раз расскажет.

Aborigen1020
() автор топика

хехег, /lib/systemd/system/postgresql.service сервис-«заглушка», он ничего не делает, не запускает.

а в реально работающем /lib/systemd/system/postgresql@.service есть указание что оне есть часть postgresql.service и запускается и отключается совместно с ним.

так что смотри логи и настройки postgresql@9.6-main.service

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

Спасибо, хоть понял зачем два service, но один с @

Ну в логах не сказано, почему он был перезапущен systemd. и почему в таком состоянии

postgresql@9.6-main.service: Failed with result 'exit-code'.
остался, пока не был запущен руками.

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

$ systemctl status postgresql@9.6-main.service

лог последней загрузки или

$ journalctl -u postgresql@9.6-main.service

логи всех загрузок. дальше только выковыривать что происходит :(

pfg ★★★★★
()

проверь pg_hba.conf, постгрес может валиться именно так, как у тебя, если pg_hba.conf неправильный, причем, он в лог ничего не напишет путного, даже с включенным дебагом.

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

Но ведь он не валится сам по себе. Я про то, что содержание pg_hba.conf лаконично, и ошибок тут я не вижу. привожу без комментариев:

local all     postgres   peer
local all     all                 md5
host  all     all     0.0.0.0/0   md5

Постгрес не запустился нормально после ребута, ему в этом помешал systemd и он же, вопреки всему, не запустил его повторно. Чую, нужно ковырять настройки для systemd. Странно что решения из коробки недостаточно. Или я чего-то не понял?

Aborigen1020
() автор топика
Ответ на: комментарий от pfg

Очень хочу выковырять, но не могу ничего выковырять из этого:

мар 26 06:49:12 mail postgres[2051]: [2-1] 2019-03-26 06:49:12.843 +04 [2051] postgres@postgres ВАЖНО:  система баз данных запускается
мар 26 06:49:12 mail postgresql@9.6-main[449]: The PostgreSQL server failed to start. Please check the log output.
мар 26 06:49:12 mail systemd[1]: postgresql@9.6-main.service: Control process exited, code=exited status=1
мар 26 06:49:12 mail postgres[1396]: [2-1] 2019-03-26 06:49:12.849 +04 [1396] СООБЩЕНИЕ:  получен запрос на "вежливое" выключение
мар 26 06:49:20 mail postgres[2062]: [3-1] 2019-03-26 06:49:20.347 +04 [2062] vmail@vmail ВАЖНО:  система баз данных останавливается
мар 26 06:49:22 mail postgres[1616]: [3-1] 2019-03-26 06:49:22.068 +04 [1616] СООБЩЕНИЕ:  система БД была остановлена нештатно; производится автоматическое восстановление
мар 26 06:49:22 mail postgres[1616]: [4-1] 2019-03-26 06:49:22.254 +04 [1616] СООБЩЕНИЕ:  неверная длина записи по смещению 1/9BFE0AC0: ожидалось 24, получено 0
мар 26 06:49:22 mail postgres[1616]: [5-1] 2019-03-26 06:49:22.254 +04 [1616] СООБЩЕНИЕ:  данные REDO не требуются
мар 26 06:49:22 mail postgres[1616]: [6-1] 2019-03-26 06:49:22.858 +04 [1616] СООБЩЕНИЕ:  Защита от зацикливания мультитранзакций сейчас включена
мар 26 06:49:22 mail postgres[2071]: [3-1] 2019-03-26 06:49:22.866 +04 [2071] СООБЩЕНИЕ:  выключение
мар 26 06:49:23 mail systemd[1]: Failed to start PostgreSQL Cluster 9.6-main.
мар 26 06:49:23 mail systemd[1]: postgresql@9.6-main.service: Unit entered failed state.
мар 26 06:49:23 mail systemd[1]: postgresql@9.6-main.service: Failed with result 'exit-code'.

Кажется, нужно больше времени для включения.

Как может бд, которая «запускалась», но postgresql сервер уже «Failed to start», получать запрос и «вежливо» выключаться?

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

Проверь комменты. Если ты случайно расскоментил строчку, то постгрес тихо не запустится, у было такое. Возможно, что так же происходит и с postgresql.conf

Тут systemd не причем. Включи дебаг лог в файл и смотри, что постгрес при попытке старта пишет.

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

Включи дебаг лог в файл и смотри, что постгрес при попытке старта пишет.

Здравая в общем-то идея. посмотрю, отпишусь.

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

А, ну и, чтобы наверняка исключить systemd, попробуй стартануть постгрю руками. Я почти на 100% уверен, что она не запустится.

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

А вот это немного не хочу делать. Тут несколько баз для почтового сервера, получится эксперементировать только в нерабочее время. Пока потренируюсь на тестовом. А какого уровня дебага будет достаточно? debug3?

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

А вот это немного не хочу делать. Тут несколько баз для почтового сервера, получится эксперементировать только в нерабочее время

Так он у тебя запустился всё-таки?

А какого уровня дебага будет достаточно? debug3?

Я бы максимум ставил

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

Он запустился только руками, хотя до этого systemd его не подняло. дал service postgresql start и все запустилось.

Ну а сам он по себе не падает, хотя причину перезагрузки сервера я еще не установил.

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

Какой еще service? У тебя там systemd. Тебе нужно енейблить и запускать postgresql@9.6-main.service, или какая у тебя там версия.

systemctl enable postgresql@9.6-main.service
systemctl start postgresql@9.6-main.service

Юнит postgresql.service не делает ничего.

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

не совсем. запуск postgresql запустит и связанный с ним postgresql@9.6-main.service.

сделано, думаю, для универсального имени сервиса.

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

Да.
По совету anonymous перевел их на обычный init и теперь стартует после форс-мажоров долго, но надежно самовосстанавливается. Один раз вызывали - дождались старта вместе. Больше не вызывали.

Виноват, позже дошло, что сказал прошлый раз неоднозначно. А кнопки «редактировать» не было.

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