使用tshark抓取PostgreSQL v12流量时SQL参数缺失的解决方法
解决tshark抓取PostgreSQL流量看不到参数值的问题
你看到的$1、$2这类占位符,是因为PostgreSQL使用了预编译语句(Prepared Statements):查询模板和实际参数是分开发送的,pgsql.query字段仅捕获模板部分,参数会在独立的数据包中传输,所以你当前的命令看不到参数值。
调整tshark命令捕获参数
修改命令,添加捕获参数相关的字段,同时保留事务ID或帧号来关联模板和参数:
tshark -f 'tcp dst port 5432' -O PGSQL \ -d 'tcp.port==5432,pgsql' -T fields \ -e frame.number \ -e pgsql.transaction.id \ -e pgsql.query \ -e pgsql.prepared_statement.name \ -e pgsql.param.value
frame.number:数据包编号,用于快速定位对应关系pgsql.transaction.id:事务ID,同一个事务内的模板和参数属于同一次查询pgsql.prepared_statement.name:预编译语句的名称,用来精准匹配模板和对应的参数pgsql.param.value:实际的参数值,顺序对应模板中$1、$2的位置
关联模板与参数
输出结果中,同一个pgsql.transaction.id或pgsql.prepared_statement.name对应的pgsql.query(模板)和pgsql.param.value(参数)是一一对应的,参数的顺序和模板里的占位符顺序完全匹配。
更直观的查看方式
如果想要直接看到绑定参数后的完整语句效果,也可以不用-T fields模式,直接让tshark输出完整的协议解码内容:
tshark -f 'tcp dst port 5432' -O PGSQL -d 'tcp.port==5432,pgsql'
或者用Wireshark图形界面打开捕获文件,展开PostgreSQL协议的Parameter Data部分,就能直接看到每个占位符对应的实际参数值。
内容的提问来源于stack exchange,提问作者Patrick Rynhart
相关产品推荐
相关产品推荐

