获取PostgreSQL中当前正在运行的查询的参数

laik7k3q  于 11个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(145)

我们写了一个小工具,可以显示所有当前运行的查询。我们从pg_stat_activity中获取当前运行的查询。
问题是:我们不知道给查询的参数,我们只能看到占位符$1,$2等。
有没有办法获取当前运行的查询的参数?
唯一的解决方法是启用查询日志并从查询日志中解析参数,但这将是一个非常脏且缓慢的解决方案。

2vuwiymt

2vuwiymt1#

我觉得不可能。我也遇到过同样的问题。

zsbz8rwp

zsbz8rwp2#

我使用存储过程/函数来运行所有的查询。这样你就可以在每个函数的开始添加代码来记录。

6fe3ivhb

6fe3ivhb3#

我是如何解决这个问题的:

  1. 1分钟数据包捕获:timeout 60s tcpdump -w db-$(date +%Y%m%d-%H%M).pcap
    1.可选压缩文件:gzip db-$(date +%Y%m%d-%H%M).pcap
    1.将文件复制到您的工作站并在wireshark中打开,它可以理解gzip文件,而无需扩展它们。
    x1c 0d1x的数据
    根据文档,参数化查询使用扩展查询协议,并有多个部分:
    1.解析消息。这包括带有参数的查询字符串,一些关于由对象标识符(Object Identifier,上下文敏感的类型标识)定义的参数数据类型的元数据。这是我在PGAdmin中看到的。
    1.绑定消息:包含参数占位符的值,并指定返回数据的格式。所有值都在那里!
    1.描述/执行/同步消息,因为我们不使用准备好的语句或存储过程为我的查询,这些都是一种组合和运行查询和关闭未准备好的语句和查询计划。
    1.解析完成/绑定完成/行描述/数据行:这是查询的结果。
    我来自MySQL-land,我不知道传递给数据库的是什么值,这对我来说似乎很奇怪!在困惑了一段时间之后,我认为这些值必须以某种方式进行通信,这将通过网络进行,所以我尝试了数据包捕获,它们就在那里!在我的例子中,我们没有使用存储过程或准备好的语句,我们在PosgreSQL版本12上,我们没有使用SSL(这使得阅读捕获更容易)。

相关问题