问题描述
我们想杀死 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
参数来做到这一点。