原文地址 https://www.bytebase.com/blog/postgres-timeout/
PostgreSQL 提供各种超时 (Timeout) 设置,通过控制某些进程的持续时间来帮助管理和优化数据库操作。这些超时对于确保系统的稳定性和性能至关重要,尤其是在高流量或复杂查询的环境中。让我们一一回顾。
语句超时 (statement_timeout)
statement_timeout 设置了单个查询允许执行的最长时间限制。如果查询超过了这个时间限制,PostgreSQL 将自动终止查询并返回错误信息。
ERROR: canceling statement due to statement timeout
错误:由于语句超时而取消语句
如果单个 simple-Query 消息中出现多个 SQL 语句,则超时将分别应用于每个语句。statement_timeout 可有效防止长时间运行的查询占用过多资源或导致数据库出现性能问题。
锁超时 (lock_timeout)
lock_timeout 控制一个事务为获得数据库对象(如表或行)上的锁而等待的时间,然后才会放弃并返回错误。
ERROR: canceling statement due to lock timeout
错误:由于锁超时而取消语句
在 Postgres 中,等待获取资源锁的事务会阻塞需要在同一资源上获取冲突锁的传入事务。对于获取重量级锁(如运行 DDL 语句)的事务,建议设置 lock_timeout。常见的做法是创建一个单独的 Postgres 用户来运行 DDL,并为该用户设置一个较短的 lock_timeout。
ALTER ROLE ddl_user SET lock_timeout = 10000; -- 10 秒
ERROR: terminating connection due to idle-in-transaction timeout
错误:由于事务中的空闲超时而终止连接
空闲会话超时 (idle_session_timeout)
ERROR: terminating connection due to idle session timeout
错误:由于空闲会话超时而终止连接
ALTER ROLE interactive_user SET idle_session_timeout = 600000; -- 10 分钟
事务超时 (transaction_timeout)
网络服务器 应用程序服务器 数据库服务器
参考资料
官方文档 (https://www.postgresql.org/docs/current/runtime-config-client.html)
pgsql-hackers 关于引入 transaction_timeout 的讨论 (https://www.postgresql.org/message-id/flat/f508267d1ba8f0bfd7b93181d10511dc%40oss.nttdata.com#2506da45ff92aaea65c30996fbf19c85)