gpt4 book ai didi

postgresql - Postgres - 如何调试/跟踪 'Idle in transaction' 连接

转载 作者:行者123 更新时间:2023-11-29 11:12:33 24 4
gpt4 key购买 nike

我正在为我的一个应用程序使用 Postgres,有时(不是很频繁)其中一个连接进入 <IDLE> in transaction状态并保持获取锁,导致其他连接等待这些锁,最终导致我的应用程序挂起。

以下是 pg_stat_activity 的输出该过程的表:

select * from pg_stat_activity

24081 | db | 798 | 16384 | db | | 10.112.61.218 | | 59034 | 2013-09-12 23:46:05.132267+00 | 2013-09-12 23:47:31.763084+00 | 2013-09-12 23:47:31.763534+00 | f | <IDLE> in transaction

这表明 PID=798<IDLE> in transaction状态。使用 client_port 找到 Web 服务器上的客户端进程如下( 59034 ) 来自上面的输出。

sudo netstat -apl | grep 59034

tcp 0 0 ip-10-112-61-218.:59034 db-server:postgresql ESTABLISHED 23843/pgbouncer

我知道我的应用程序代码有问题(我终止了一个正在运行的应用程序 cron 并释放了锁)导致连接挂起,但我无法跟踪它。

这不是很频繁,我也找不到任何明确的复制步骤,因为这只发生在生产服务器上。

我想获得有关如何跟踪此类空闲连接的输入,例如获取上次执行的查询或某种追溯以确定是哪部分代码导致了此问题。

最佳答案

如果升级到 9.2 或更高版本,pg_stat_activity View 将向您显示最近执行的查询是关于 idle in transaction 的连接。

select * from pg_stat_activity  \x\g\x

...
waiting | f
state | idle in transaction
query | select count(*) from pg_class ;

您还可以(即使在 9.1 中)查看 pg_locks查看 idle in transaction 持有哪些锁过程。如果它只锁定非常常用的对象,这可能不会缩小范围,但如果它是一个特殊的锁,可以准确地告诉您在代码中查找的位置。

如果您受困于 9.1,您或许可以使用调试器获取查询的前 22 个字符以外的所有字符(前 22 个字符被 <IDLE> in transaction\0 消息覆盖)。例如:

(gdb) printf "%s\n", ((MyBEEntry->st_activity)+22)

关于postgresql - Postgres - 如何调试/跟踪 'Idle in transaction' 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com