Если у меня есть длительный запрос 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
на сервер, для меня, хотя:Я просто пытаюсь удалить устаревшие базы данных / схемы, которые по-прежнему имеют длительное соединение, от которого оно не избавится.
Итак, чтобы ответить на ваш вопрос,
НЕ имеет отношения к выключению сервера в любом случае.
Я также видел это поведение
pg_cancel_backend()
не работает. И хотел поделиться своим рабочим решением.До сих пор я не видел проблемы с какой-либо «потерей» данных.
Опять же, я тоже не пытаюсь убивать
Active
запросы.Надеюсь это поможет. знак равно
~ Jay
источник