57P05 — idle_session_timeout
57P05
速览
57P05 在 idle_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。
相关
来源
src/backend/tcop/postgres.c#L3504-3513
src/backend/tcop/postgres.c#L4585-4650
src/backend/tcop/postgres.c#L4704-4721
结构化证据记录保存消息和 idle 状态边界。