Уничтожение незанятых соединений, находящихся в режиме ожидания более 4 часов

#postgresql #connection #kill

#postgresql #подключение #убить

Вопрос:

Мы хотели бы уничтожить простаивающие соединения в Postgres, которые находятся там более 4 часов, в идеале, мы хотели бы создать cron для этого.

На какое поле мы должны смотреть в pg_stat_activity? У нас есть эти:

 backend_start
query_start
state_change
 

Мы предполагаем, что это backend_start …

Затем мы могли бы сделать что-то вроде этого:

 select pg_terminate_backend(pid) 
from pg_catalog.pg_stat_activity
where backend_start<CURRENT_TIME-4Hours and state='idle';
 

Ответ №1:

Это зависит от правил подключения. Если соединение открыто только для выполнения одной транзакции (или группы транзакций, предоставляемых пакетным заданием), вы можете практически уничтожить все незанятые сеансы. Когда соединениям разрешено оставаться открытыми и ожидать новых онлайн-запросов, state-change следует учитывать, что эта временная метка указывает, как долго соединение было простаивающим.

Ответ №2:

Начиная с PostgreSQL версии 14, вы можете использовать idle_session_timeout параметр, который делает именно это.

Комментарии:

1. Я забыл сказать, что мы используем Postgres V9.4

2. Тогда вам придется прибегнуть к решению клина.