跳转到主要内容

57P05 — idle_session_timeout

PostgreSQL 57P05 的来源与诊断参考。

57P05

速览

57P05idle_session_timeout 到期、backend 确实处于命令之间的 idle 状态时终止 session。固定代码只在无事务分支启动这个 timer;idle-in-transaction 使用另一条件和 timer。

字段
SQLSTATE 57P05
条件名 idle_session_timeout
状态 有效
已知存在于 14.0
锁定快照 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_IDLE_SESSION_TIMEOUT
别名

含义

固定 primary 是 terminating connection due to idle-session timeout,severity 为 FATAL。PostgresMain 在 backend 报告 STATE_IDLE 后、且 IsTransactionOrTransactionBlock() 为假时才启用 idle-session timer。读到命令后立即关闭该 timer。因此 57P05 是 session 生命周期终止,区别于 statement timeout 57014、lock timeout 55P03、idle-in-transaction timeout 25P03 和 transaction timeout 25P04

消息

  • primary:terminating connection due to idle-session timeout
  • severity:FATAL;timer interrupt 会终止连接,不返回可恢复的语句级 ERROR。
  • 边界:命令之间真正 idle 的 session 使用 57P05;开放事务内 idle 的 session 使用单独的 idle-in-transaction timer/条件。

诊断

记录 primary、backend PID、idle_session_timeout 值及来源、最后一条命令、pg_stat_activity 状态、事务状态和服务器日志。确认 timer 启动时 session 是 idle 还是 idle in transaction。单凭客户端耗时不能把它和 statement/lock timeout 区分开,还应结合连接最后的 ReadyForQuery 状态解释 SQLSTATE。

处理

关闭或重建已过期连接,把长时间工作改成明确的工作单元,不要依赖闲置 session。只有策略允许且工作负载确有需要时才调整 idle_session_timeout。FATAL 会关闭连接,原 session 上没有可发送的有效 ROLLBACK;重连后,重放非幂等命令前先核对持久化效果。若工作实际是在事务内 idle,应分别诊断 25P03/25P04 和事务归属。

版本

锁定目录从 14.0 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6。

57P0125P0325P045701455P03

来源

src/backend/tcop/postgres.c#L3504-3513

src/backend/tcop/postgres.c#L4585-4650

src/backend/tcop/postgres.c#L4704-4721

结构化证据记录保存消息和 idle 状态边界。