PostgreSQL:在完成之前通过 dblink 获取查询的 PID

PostgreSQL: Get PID of a query via dblink before it finishes

我想监控我通过 dblink dblink_send_query 发送的查询,因此我需要它的 PID 以便我可以在 pg 表中搜索它. 但到目前为止,我只能在 dblink 完成后通过返回值 pg_backend_pid() 获得 PID ,或者通过使用查询字符串搜索从 pg_stat_activity 获取它非常笨拙,它不考虑多个相同的查询,或者对于文本很长的查询来说真的不理想。

那么我怎样才能在它完成之前获得它的 PID?

select dblink_send_query('cn1', 'select pg_sleep(60)');
select dblink_send_query('cn2', 'select pg_sleep(60)');
select dblink_send_query('cn3', 'select pg_sleep(60)');

PostgreSQL 11.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

后端进程 ID 在 dblink 连接的整个生命周期内保持不变。

因此,当您打开连接时,运行 SELECT pg_backend_pid() 首先将结果保存在与连接关联的数据结构中。然后您可以查询该数据结构以获取该连接的后端进程 ID。

我 运行 遇到了同样的问题。我用下面的方法来解决同样的问题。

select dblink_connect('cn1',*connectionstring*);
select pid from dblink('cn1', 'select pg_backend_pid()') as (pid integer);
select dblink_send_query('cn2', 'select pg_sleep(60)');