Что мне делать, если pg_cancel_backend не работает?


8

Если у меня есть длительный запрос Postgres, и обычный «kill [pid]» не работает, а pg_cancel_backend не работает, что мне делать?

Ответы:


8

Вы никогда не должны уничтожать -9 любого процесса postgres, если ваша цель не состоит в том, чтобы принудительно остановить весь сервер. Вы можете убить любой процесс, который не отвечает на вызов pg_cancel_backend () из оболочки с помощью

kill <pid>

т.е. не -9. Обратите внимание, что я видел несколько раз, когда даже это не работало из-за зависания процесса, ожидающего в некотором цикле данных для сетевого подключения. Если я правильно помню, об этом позаботился процесс уничтожения клиента.


8

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.


+1 PostgreSQL использует процесс для каждого соединения, поэтому вы можете убить процесс без особой опасности повлиять на другие соединения. Я не уверен, есть ли вероятность повреждения данных, но я действительно сомневаюсь в этом.
Дэвид Пашли

Я думал, что отправка kill -9 процессу postgres была катастрофической, поскольку он мог перевести базу данных в режим восстановления, что могло вывести ее из строя на многие минуты.

1
stackoverflow.com/questions/920956/… Кажется, я не прав.
Bribles

Эта ссылка касается отправки kill -9 на сервер . Я говорю о пиде одного запроса. Или это одно и то же?

2
@Bribles, пожалуйста, добавьте предупреждение в свой пост! SIGQUIT вызовет СЕРЬЕЗНЫЕ ПРОБЛЕМЫ, если попытаться. Я только что сделал, и это вызвало много проблем - я хотел бы вернуться назад во времени и не дать себе нажать клавишу Enter!
ADTC


1

хрупкость верна в своем утверждении выше ...

Если вы пытаетесь 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.