杀死闲置超过 4 小时的连接

问题描述

我们想杀死 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';

解决方法

这取决于连接规则。如果打开连接仅执行单个事务(或批处理作业提供的一组事务),您几乎可以杀死所有空闲会话。当允许连接保持打开状态并等待新的在线查询时,应考虑 state-change,因为此时间戳表示连接空闲的时间。

,

从 PostgreSQL v14 开始,您可以使用 idle_session_timeout 参数来做到这一点。