как завершить сеансы postgresql 8.3?

Вопрос: Я пытаюсь завершить сеанс (конкретный сеанс или все сеансы, не имеет значения) в postgresql 8.3, и у меня возникают проблемы с этим. Я знаю, что в более новых версиях (8.4 и более поздних) есть команда pg_terminate_backend, которая будет делать трюк, но это невозможно в postgresql 8.3. Если я использую pg_stat_activity, я могу видеть все

Вопрос:

Я пытаюсь завершить сеанс (конкретный сеанс или все сеансы, не имеет значения) в 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»;

Оцените статью
Добавить комментарий