# 57P05 — idle_session_timeout

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

# 57P05

## 速览 {#at-a-glance}
`57P05` 在 `idle_session_timeout` 到期、backend 确实处于命令之间的 idle 状态时终止 session。固定代码只在无事务分支启动这个 timer；idle-in-transaction 使用另一条件和 timer。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

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

<!-- source facts: data/errcodes/57P05.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}
固定 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`。

## 消息 {#messages}

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

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

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

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

## 相关 {#related}
[`57P01`](../57p01/)、[`25P03`](../25p03/)、[`25P04`](../25p04/)、[`57014`](../57014/)、[`55P03`](../55p03/)

## 来源 {#sources}
[`src/backend/tcop/postgres.c#L3504-3513`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/tcop/postgres.c#L3504)

[`src/backend/tcop/postgres.c#L4585-4650`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/tcop/postgres.c#L4585)

[`src/backend/tcop/postgres.c#L4704-4721`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/tcop/postgres.c#L4704)

结构化[证据记录](../../data/evidence/57p05.json)保存消息和 idle 状态边界。
