我正在调查PostgreSQL中的连接泄漏,并希望收集一些诊断信息。
特别是,我想将一些信息与我所建立的每个连接相关联,然后才能直接查询。
如果我在MS-SQL中设计这种东西,我会改变连接工厂,在每次建立连接后对诊断表执行upsert,包含@@spid,回溯和其他诊断信息。< / p>
然后,为了诊断发生了什么,我可以在spid上查询sysprocesses加入我的诊断表。这将为我提供与每个连接相关联的干净的应用程序回溯。
如何在PostgreSQL上实现类似的功能?
答案 0 :(得分:4)
PostgreSQL分支处理每个连接的新进程。您可以轻松获得此过程的PID:
SELECT pg_backend_pid();
这对应于标准管理工具(top
,ps
等)中可见的流程ID。您也可以使用标准工具终止连接(kill
),或者使用适当的权限通过说SELECT pg_terminate_backend(pid)
来终止连接。
数据库中也可以访问当前会话列表:
SELECT * FROM pg_stat_activity;
最后一点:PID在运行查询时保证是唯一的,但最终会被操作系统重用。您可以通过将PID与backend_start
的{{1}}列配对来确保唯一性。就此而言,您可能会将其与日志记录混为一谈:
pg_stat_activity