使用pg_stat_activity中的client_port == – 1来确定负责查询的进程

我试图追踪由pid确定的postgres查询的来源。 通常情况下,您可以通过查找pg_stat_activity表中的client_addr和client_port字段来完成此操作。

但是,有些条目具有client_port -1或NULL。 这是什么意思,如何才能find这些查询的来源?

我认为NULL端口表示这是一个内部postgres操作,我怀疑-1意味着本地连接 – 但我无法弄清楚本地连接如何与postgres守护进程进行通信。

我发现了一个似乎可行的魔术。 至less在一台特定的Ubuntu linux机器上。

在postgres后端运行lsof,find一个像这样的unix套接字:

postgres 6571 postgres 8u unix 0xffff81061ab3a000 205980094 /var/run/postgresql/.s.PGSQL.5432 

值205980094是inode。 虽然连接到这个套接字的客户端unix套接字是匿名的,并且你不能说服linux上的lsof告诉你它是在与后端套接字同时创build的unix套接字的终点。 所以似乎有一个通常与这个数字相邻的inode号码。

在整个系统上运行lsof,限制unix套接字(使用grep),然后用这个键( sort -k 7 -nsorting,希望告诉负责查询的进程。

那些是通过本地unix连接的连接,是的。 如果您使用基于软件包的安装,它们将通过源安装中的/ tmp中的套接字或/ var / run / postgresql之类的位置。

应该可以使用例如lsof来查找客户端进程。