易君召
易君召
发布于 2026-07-23 / 1 阅读
0
0

PostgreSQL 慢查询日志全套核心参数详解

PostgreSQL 慢查询日志的所有参数均在 postgresql.conf 中配置,分为日志开关控制、慢查询阈值、日志内容、日志文件轮转、日志存储路径五大类,附生产推荐值与作用说明。

一、基础日志总开关(必须开启才能记录慢 SQL)

1. logging_collector

ini

logging_collector = on
  • 作用:日志收集器总开关,off 时所有文件日志失效,仅输出控制台

  • 生产:强制 on

2. log_destination

ini

log_destination = 'csvlog'

可选值:stderr / csvlog / syslog

  • csvlog:推荐,结构化 CSV 日志,可用 pgBadger/pg_loganalyzer 解析过滤慢 SQL

  • stderr:简单文本日志,可读性差

二、慢查询核心阈值参数(控制 “多慢才算慢日志”)

1. log_min_duration_statement(慢日志核心阈值)

ini

log_min_duration_statement = 100

单位:毫秒 ms

  • 含义:执行耗时超过该值的 SQL,会被记录到慢日志

  • 0:记录所有 SQL;-1:关闭慢查询记录

  • 推荐:业务系统 100~500,报表库 1000

2. log_min_duration_sample(采样慢日志,高并发专用)

ini

log_min_duration_sample = 500
log_sample_rate = 0.1
  • 作用:当 SQL 耗时超过阈值,按比例采样记录,避免高并发下日志爆炸

  • log_sample_rate:0~1,0.1 代表 10% 采样

三、日志记录内容控制(控制日志里打印哪些信息)

1. log_statement(控制记录哪些类型 SQL)

ini

log_statement = 'mod'

四个可选值:

  1. none:不记录任何 SQL(仅慢日志会记录超过阈值的)

  2. ddl:仅记录建表、改表、索引等 DDL 语句

  3. mod:DDL + INSERT/UPDATE/DELETE(增删改,生产最常用)

  4. all:记录所有 SQL(SELECT 也全量打印,调试用,线上高并发慎用)

搭配 log_min_duration_statement:

log_statement=mod 只会完整打印 DML/DDL;SELECT 只有超过慢查询阈值才会记录。

2. log_connections / log_disconnections

ini

log_connections = on
log_disconnections = on

记录客户端连接、断开事件,排查连接暴涨、连接泄漏。

3. log_error_verbosity

ini

log_error_verbosity = verbose

控制日志详情:terse(简略) / default / verbose(最全)

verbose 会打印参数、上下文,排查慢 SQL 必备。

4. log_line_prefix(日志行前缀,关键定位信息)

ini

log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a '

占位符说明(常用):

  • %t:时间戳

  • %p:后端进程 PID

  • %u:执行用户

  • %d:数据库名

  • %a:应用程序名称(区分不同业务服务)

  • %l:行号

    作用:每条日志自带用户、库、应用,快速定位慢 SQL 来源。

5. log_parameter_max_length / log_parameter_max_length_on_error

ini

log_parameter_max_length = -1
  • -1:完整打印 SQL 绑定参数;0:不打印参数

    排查带参数慢查询时必须开启。

四、日志文件存储 & 轮转(防止日志打满磁盘)

1. log_directory

ini

log_directory = 'pg_log'

日志存放文件夹,相对路径在 PG 数据根目录,可配置绝对路径 /var/log/postgres

2. log_filename

ini

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

日志文件名模板,按日期自动生成,便于按天拆分日志。

3. log_rotation_age

ini

log_rotation_age = 1d

日志轮转时间:1d = 每天生成新日志,单位 min/h/d。

4. log_rotation_size

ini

log_rotation_size = 100MB

单日志文件最大容量,超过自动切新文件,防止单个日志几十 G。

5. log_truncate_on_rotation

ini

log_truncate_on_rotation = on

同名日志文件自动覆盖,避免日志文件无限堆积。

五、辅助日志参数(锁、慢查询额外记录)

1. log_lock_waits

ini

log_lock_waits = on
deadlock_timeout = 1000
  • log_lock_waits:开启锁等待日志,SQL 等待锁超过 deadlock_timeout 则记录

  • 排查并发锁等待、死锁阻塞必备

2. log_autovacuum_min_duration

ini

log_autovacuum_min_duration = 500

记录执行超时的自动清理任务,监控 autovacuum 慢、表膨胀问题。

六、生产环境完整标准配置模板

ini

# 总开关
logging_collector = on
log_destination = 'csvlog'

# 慢查询阈值:超过100ms记录
log_min_duration_statement = 100

# SQL记录范围:DDL+增删改
log_statement = 'mod'

# 日志详情、参数打印
log_error_verbosity = verbose
log_parameter_max_length = -1

# 日志前缀,定位用户/库/应用
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a '

# 连接日志
log_connections = on
log_disconnections = on

# 锁等待日志
log_lock_waits = on
deadlock_timeout = 1000

# 自动vacuum日志
log_autovacuum_min_duration = 500

# 日志存储与轮转
log_directory = '/var/log/postgres'
log_filename = 'pg-%Y-%m-%d.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_truncate_on_rotation = on

七、补充说明

  1. 修改 postgresql.conf 后,执行 SELECT pg_reload_conf(); 热加载,无需重启数据库;

  2. csvlog 日志推荐搭配 pgBadger 工具,一键统计 Top 慢 SQL、锁等待、执行频次;

  3. 高并发业务不建议 log_statement=all,会大量消耗 IO,只依靠 log_min_duration_statement 捕获慢查询即可。


评论