Я бегу:

select *
from pg_stat_activity

И есть несколько старых запросов (которые все еще выполняются в фоновом режиме БД), которых их приложение python не существует (приложения вылетают или останавливаются без вызова команды закрытия соединения)

State          wait_event   backend_type
Active         null         parallel_backend

Есть ли способ закрыть все запросы, процессы которых больше не существуют?

Я видел этот пост:

Убить сеанс / соединение postgresql

Но я не хочу уничтожать все сеансы или соединения, потому что есть некоторые соединения, которые собирают и обновляют важные данные.

Я просто хочу закрыть сеансы (и остановить запросы), которых их процессы больше не существуют.

1
Boom 22 Окт 2020 в 10:01

1 ответ

Лучший ответ

Если вы знаете или можете понять, какие из них не нужны, вы можете получить их стручки отсюда.

SELECT pid,* FROM pg_stat_activity;

И используйте эти pid вместе с dbname, чтобы уничтожить эти соединения.

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
where datname in (<put dbname over here>) 
  and pid in(<put pid over here>);

Или просто используйте приведенный ниже запрос, чтобы уничтожить неактивные соединения, которые не активны.

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
where datname in (<put dbname over here>') 
  and state = 'idle';
2
a_horse_with_no_name 22 Окт 2020 в 07:52