2

我正在调查 PostgreSQL 中的连接泄漏,并希望收集一些诊断信息。

特别是,我想将一些信息与我建立的每个连接相关联,然后能够直接查询它。

如果我在 MS-SQL 中设计这种东西,我会更改我的连接工厂,以在每次连接建立后对诊断表执行 upsert,其中包含@@spid、回溯和其他诊断信息。

然后为了诊断正在发生的事情,我可以在 spid 上查询加入我的诊断表的sysprocesses 。这将为我提供与每个连接关联的干净的应用程序回溯。

如何在 PostgreSQL 上实现类似的功能?

4

1 回答 1

4

PostgreSQL 派生一个新进程来处理每个连接。您可以轻松获取此进程的 PID:

SELECT pg_backend_pid();

这对应于标准管理工具( 、 等)中可见的进程topID ps。您也可以使用标准工具 ( ) 终止连接kill,或者在具有适当权限的情况下,通过说SELECT pg_terminate_backend(pid).

当前会话的列表也可以在数据库中访问:

SELECT * FROM pg_stat_activity;

最后一点:PID 保证在查询运行时是唯一的,但最终会被操作系统重新使用。backend_start您可以通过将 PID 与 的列配对来确保唯一性pg_stat_activity。就此而言,您不妨将其与您的日志记录混为一谈:

INSERT INTO log_table (pid, backend_start, message, backtrace)
SELECT procpid, backend_start, 'my message', 'my backtrace'
FROM pg_stat_activity
WHERE procpid=pg_backend_pid();
于 2012-10-04T18:41:46.130 回答