PostgreSQL 如何记录所有查询或慢查询日志?
PostgreSQL 记录慢查询:log_min_duration_statement 设置阈值(毫秒);log_statement = 'all' 记录所有 SQL(生产慎用)。本文给出配置方法和分析工具。
记录慢查询:log_min_duration_statement = 1000(达到或超过 1000ms 的查询记入日志)。记录所有查询:log_statement = 'all'(开销大,仅调试用)。两个参数都在 postgresql.conf 中配置。
记录慢查询
编辑 postgresql.conf:
log_min_duration_statement = 1000 # 达到或超过 1 秒的查询记入日志(毫秒)
设为 0 记录所有查询的耗时(与 log_statement='all' 记录时机/范围不同,不能视为等价),设为 -1 禁用。
这些日志阈值可reload;若同时开启 logging_collector,则需重启,reload也不保证错误配置已生效,应检查日志与SHOW结果。
记录所有查询
log_statement = 'all'
可选值:none(默认)、ddl(只记建表/改表等)、mod(ddl + DML 写操作)、all(全部)。生产环境慎用 all。
建议同时配置的参数
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0
log_line_prefix 加上时间、用户与数据库名;log_temp_files=0 记录所有临时文件,log_lock_waits 仅记录超过 deadlock_timeout 的锁等待,需评估日志量。
分析工具
# pgBadger 生成 HTML 分析报告(慢查询 TOP、耗时分布等)
pgbadger /var/log/postgresql/postgresql.log -o report.html
跨实例分析时,可将生成的慢查询文件按 DataKit 文件采集 接入观测云。先核对文件路径与读权限,再用一条已知慢查询验证时间、数据库名和耗时的解析结果;SQL 中的敏感参数应在上报前处理。
常见问题(FAQ)
Q:log_min_duration_statement 设为 0 和 log_statement='all' 有什么区别?
A:前者记录每条语句的耗时(更有用),后者记录语句本身。日常用前者。
Q:可以只对某个数据库开启吗?
A:可以:ALTER DATABASE mydb SET log_min_duration_statement = 1000;,作为该库后续新会话的默认值;已有会话不会自动更新。
Q:日志文件在哪?
A:取决于 log_destination 和 logging_collector 配置。常见在 /var/log/postgresql/ 或数据目录的 log/ 子目录。