Вопрос:
Я пытаюсь завершить сеанс (конкретный сеанс или все сеансы, не имеет значения) в postgresql 8.3, и у меня возникают проблемы с этим. Я знаю, что в более новых версиях (8.4 и более поздних) есть команда pg_terminate_backend, которая будет делать трюк, но это невозможно в postgresql 8.3. Если я использую pg_stat_activity, я могу видеть все активные сессии, но не могу их прекратить.
Решение не обязательно должно быть командами sql, но я бы хотел, чтобы он не зависел от используемой ОС (т.е. Команд DOS/UNIX).
Остановка и запуск службы postgres в службах Windows работает отлично, но это подход, специфичный для ОС. Использование ‘pg_ctl restart -D DATA_DIR’ не останавливает службу. Фактически, используя pg_ctl, чтобы попытаться перезапустить службу в то время, когда я пытаюсь это сделать, это вызывает странное поведение. Если есть способ, я могу каким-то образом использовать pg_ctl, чтобы принудительно завершить процесс, как я предполагаю, что окна делают, тогда я, вероятно, смогу использовать это.
В любом случае, я ищу способ прекратить одну или все сессии в postgresql 8.3, которая не является специфичной для платформы. Любая помощь будет замечательной!
Лучший ответ:
Вы можете использовать pg_cancel_backend():
select pg_cancel_backend(55555);
Вы можете использовать это с pg_stat_activity. Например:
select pg_cancel_backend(procpid) from pg_stat_activity where current_query='<IDLE>’;
Если это не работает, вы можете попробовать следующее:
pg_ctl kill -TERM pid
Это должно быть независимым от ОС. Я не уверен, есть ли какая-то реальная разница в поведении.
Помимо этого вы можете попробовать остановить и запустить сервер, но вы указали на это странное поведение. (Какие?)
Наконец, для конкретного варианта ОС на Linux вы можете, конечно, попробовать использовать команду kill. kill -15 (SIGTERM) безопасен; что в основном используется pg_terminate_backend: kill -15 <pid>. kill -9 является умеренно опасным, и вы должны использовать его только в качестве крайней меры.
Ответ №1su — posgres psql SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activity WHERE procpid <> pg_backend_pid() AND datname = ‘dbname’ ; drop database «database name»;