我有一个长时间运行的空闲查询,该查询不会自动终止。
我已将两个最大超时设置为 2 小时(我知道很长)
> select name,setting from pg_settings where name='statement_timeout' OR name='idle_in_transaction_session_timeout';
name | setting
-------------------------------------+---------
idle_in_transaction_session_timeout | 7200000
statement_timeout | 7200000
但是我有这个
idle
查询(不是idle_in_transaction
),它是崩溃的应用程序留下的
> SELECT pid, age(clock_timestamp(), query_start), state, usename, query
FROM pg_stat_activity
WHERE query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start desc;
17117 | 02:11:40.795487 | idle | ms1-user | select distinct ....
在 AWS Aurora 上运行的 Postgres 11.13
任何人都可以解释为什么/缺少什么吗?
顾名思义,
idle_in_transaction_session_timeout
不会终止空闲会话,而是终止“事务中空闲”的会话。对于后者,您可以使用 PostgreSQL v14 中引入的idle_session_timeout
。
就您而言,问题出在 TCP keepalive 设置上。使用 Linux 上的默认 keepalive 设置,服务器需要大约 2 小时 14.5 分钟才能确定连接的另一端不再存在。所以再等几分钟:^)
如果您想减少时间,您可以设置 PostgreSQL 参数
tcp_keepalives_idle
、tcp_keepalives_interval
和 tcp_keepalives_count
(如果 Amazon 允许)。如果他们不这样做,请投诉。