Если у меня есть длительный запрос Postgres, и обычный «kill [pid]» не работает, а pg_cancel_backend не работает, что мне делать?
Если у меня есть длительный запрос Postgres, и обычный «kill [pid]» не работает, а pg_cancel_backend не работает, что мне делать?
Ответы:
Вы никогда не должны уничтожать -9 любого процесса postgres, если ваша цель не состоит в том, чтобы принудительно остановить весь сервер. Вы можете убить любой процесс, который не отвечает на вызов pg_cancel_backend () из оболочки с помощью
kill <pid>
т.е. не -9. Обратите внимание, что я видел несколько раз, когда даже это не работало из-за зависания процесса, ожидающего в некотором цикле данных для сетевого подключения. Если я правильно помню, об этом позаботился процесс уничтожения клиента.
http://www.postgresql.org/docs/current/static/server-shutdown.html
pg_cancel_backend эквивалентно отправке SIGINT процессу.
pg_terminate_backend также для SIGTERM, но если pg_cancel_backend не работает, я не понимаю, почему pg_terminate_backend будет работать.
Если вы пробовали эти варианты, вы можете попробовать SIGQUIT. Документы говорят: « Это рекомендуется только в чрезвычайных ситуациях ».
(Если вы ненавидите свои данные и надеетесь, что они умрут, вы можете использовать SIGKILL. Но я бы не стал.)
Вы можете использовать либо kill
напрямую, либо pg_ctl kill
.
если у вас есть недавний Postgres, вы можете попробовать pg_terminate_backend
вместо этого.
хрупкость верна в своем утверждении выше ...
Если вы пытаетесь SHUTDOWN
на сервер, для меня, хотя:
Я просто пытаюсь удалить устаревшие базы данных / схемы, которые по-прежнему имеют длительное соединение, от которого оно не избавится.
Итак, чтобы ответить на ваш вопрос,
Если у меня есть длительный запрос Postgres ...
pg_cancel_backend не работает ...
что мне делать?
НЕ имеет отношения к выключению сервера в любом случае.
Я также видел это поведение pg_cancel_backend()
не работает. И хотел поделиться своим рабочим решением.
До сих пор я не видел проблемы с какой-либо «потерей» данных.
Опять же, я тоже не пытаюсь убивать Active
запросы.
- Я вошел как пользователь "A" с сеансом или PID 777777.
- И собираюсь попытаться принудительно отключить еще один сеанс от ПОЛЬЗОВАТЕЛЯ «А», открытого как 123456789
- Какая спящая связь, и поэтому я также ищу
idle
в моих запросах ниже.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Попытка 1
SELECT pg_cancel_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Достаточно интересно, что Результат утверждает, что отмена ИСТИНА, но все еще существует.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Попытка 2
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- А сейчас его не существует ..
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- ПРИМЕЧАНИЕ. Я пытался использовать нелепые pid #, чтобы люди не копировали, не вставляли и не разрушали их жизни.
- ПРИМЕЧАНИЕ: по умолчанию postgres ТОЛЬКО позволит вам уничтожать процессы, запущенные под ВАШЕЙ регистрацией в USER,
- ПРИМЕЧАНИЕ: но вы уже знали это.
Надеюсь это поможет. знак равно
~ Jay