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 禁用。
改完执行 SELECT pg_reload_conf(); 或 pg_ctl reload 热加载,不用重启。
记录所有查询
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 加上时间、用户、数据库名等信息,让日志更有用。
分析工具
# pgBadger 生成 HTML 分析报告(慢查询 TOP、耗时分布等)
pgbadger /var/log/postgresql/postgresql.log -o report.html
观测云对照
观测云提供 PostgreSQL 集成,可采集慢查询日志和性能指标,在监控视图中统一分析慢查询趋势并配置告警,比逐台登录分析日志效率高得多。
常见问题(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/ 子目录。