YugabyteDB YSQL中log_min_duration_statement对预准备语句不生效及日志无时长显示问题咨询
log_min_duration_statement的问题 你的问题主要由两个关键配置冲突和缺失导致,下面一步步拆解原因并给出解决方案:
1. ysql_log_statement=all覆盖了时长过滤逻辑
PostgreSQL(YugabyteDB兼容PostgreSQL生态)中,log_statement=all的优先级高于log_min_duration_statement——当你设置ysql_log_statement=all时,不管语句执行时长多久,所有SQL语句(包括预准备语句的execute阶段)都会被强制记录,这直接跳过了log_min_duration_statement的时长过滤规则。这就是为什么你看到所有预准备语句执行都被记录下来的核心原因。
2. 缺失执行时长记录的配置
默认情况下ysql_log_duration参数是关闭的,这导致日志中不会输出语句的执行时长,自然也无法基于时长进行过滤。你当前的日志里只有语句内容和参数,没有时长字段,就是因为这个参数没开启。
解决方案:调整tserver启动参数
修改你的tserver启动参数,调整为以下配置:
--ysql_log_min_duration_statement=60000 \ --ysql_log_statement=none \ --ysql_log_duration=on
ysql_log_statement=none:关闭全量语句日志,让log_min_duration_statement的过滤规则生效;如果需要记录DDL语句,可以改成ysql_log_statement=mod(会记录所有数据定义语句,DML仍按时长过滤)。ysql_log_duration=on:开启执行时长记录,日志中会新增duration: X ms的字段,这样log_min_duration_statement才能根据时长筛选需要记录的语句。
生效方式
修改参数后,需要重启所有tserver节点,让配置生效。重启后,只有执行时长超过60秒(60000ms)的YSQL语句(包括预准备语句的execute阶段)才会被记录到日志中,且每条日志会包含对应的执行时长。
示例生效后的日志
调整配置后,符合时长条件的日志会类似这样:
2022-03-04 16:28:53.595 UTC [1548953] LOG: execute lrupsc_349_3: UPDATE table SET f1 = $1, f2 = $2, f3 = $3 WHERE f4 = $4
2022-03-04 16:28:53.595 UTC [1548953] DETAIL: parameters: $1 = 'Running', $2 = 'worker-0', $3 = '2022-03-04 16:28:53.597931+00', $4 = 'c8h3shbp695ddkmko6e0'
2022-03-04 16:28:53.655 UTC [1548953] LOG: duration: 60.000 ms
针对你的版本说明
你使用的YugabyteDB 2.8.0.0b37完全支持上述参数,这些配置都是兼容PostgreSQL的原生参数逻辑,调整后可以正常生效。
内容的提问来源于stack exchange,提问作者dh YB

