我们写了一个小工具,可以显示所有当前运行的查询。我们从pg_stat_activity中获取当前运行的查询。问题是:我们不知道给查询的参数,我们只能看到占位符$1,$2等。有没有办法获取当前运行的查询的参数?唯一的解决方法是启用查询日志并从查询日志中解析参数,但这将是一个非常脏且缓慢的解决方案。
2vuwiymt1#
我觉得不可能。我也遇到过同样的问题。
zsbz8rwp2#
我使用存储过程/函数来运行所有的查询。这样你就可以在每个函数的开始添加代码来记录。
6fe3ivhb3#
我是如何解决这个问题的:
timeout 60s tcpdump -w db-$(date +%Y%m%d-%H%M).pcap
gzip db-$(date +%Y%m%d-%H%M).pcap
3条答案
按热度按时间2vuwiymt1#
我觉得不可能。我也遇到过同样的问题。
zsbz8rwp2#
我使用存储过程/函数来运行所有的查询。这样你就可以在每个函数的开始添加代码来记录。
6fe3ivhb3#
我是如何解决这个问题的:
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(这使得阅读捕获更容易)。