PostgreSQL开启慢查询日志的方法详解

 更新时间:2025年11月18日 09:06:03   作者:檀越@新空间  
PostgreSQL 可以通过配置参数来记录执行时间超过指定阈值的查询,即慢查询日志,下面小编就为大家详细讲讲开启慢查询日志的详细步骤吧

PostgreSQL 可以通过配置参数来记录执行时间超过指定阈值的查询,即慢查询日志。以下是开启慢查询日志的步骤:

1. 修改 postgresql.conf 配置文件

找到 PostgreSQL 的配置文件(通常位于数据目录中,如 /var/lib/postgresql/data/postgresql.conf/etc/postgresql/[版本]/main/postgresql.conf),修改以下参数:

# 开启日志记录
logging_collector = on

# 设置日志输出目录(可选)
log_directory = 'pg_log'

# 设置日志文件名模式(可选)
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

# 记录慢查询(单位:毫秒)
log_min_duration_statement = 1000  # 记录执行超过1秒的查询

# 可选:记录所有语句(包括慢查询)
#log_statement = 'all'  # 可选值为 none, ddl, mod, all

# 可选:记录执行计划
#auto_explain.log_min_duration = 1000
#auto_explain.log_analyze = on
#auto_explain.log_buffers = on
#auto_explain.log_timing = on
#auto_explain.log_triggers = on
#auto_explain.log_verbose = on
#auto_explain.log_nested_statements = on

2. 重新加载配置

不需要重启 PostgreSQL 服务,只需执行以下命令重新加载配置:

# 方法1:使用 psql
psql -U postgres -c "SELECT pg_reload_conf();"

# 方法2:使用系统命令
sudo systemctl reload postgresql  # 根据您的系统和服务管理工具可能不同

3. 验证配置

-- 检查当前配置
SELECT name, setting, unit FROM pg_settings
WHERE name IN ('logging_collector', 'log_min_duration_statement');

4. 查看慢查询日志

日志文件默认会生成在配置的 log_directory 目录中,文件名遵循 log_filename 模式。

5.高级选项

记录执行计划:启用 auto_explain 模块可以记录查询的执行计划

shared_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '1s'
auto_explain.log_analyze = on

按用户或数据库记录

# 只记录特定数据库的慢查询
log_min_duration_statement = 1000
log_connections = on
log_disconnections = on
log_line_prefix = '%m [%p] %q%u@%d '

日志轮转

log_rotation_age = 1d      # 每天轮转
log_rotation_size = 10MB   # 或按大小轮转

6.知识扩展

PostgreSQL 慢查询获取方法整理

1.获取慢查询的方法

  • 方法一 :开启慢查询日志
  • 方法二 :使用pg_stat_statementes扩展(推荐)
  • 方法三 : 捕获当前连接中的查询

2.开启慢查询日志

    postgresql.conf
        log_destination = 'csvlog'           #日志基础设置
        logging_collector = on                #日志基础设置(重启生效)
        log_directory = 'pg_log'              #日志基础设置
        log_filename = 'postgresql-%Y-%m-%d.log'   #日志基础设置
        log_file_mode = 0600                 #日志基础设置
        log_truncate_on_rotation = off   #日志基础设置
        log_rotation_age = 1d                #日志基础设置
        log_rotation_size = 0                 #日志基础设置
        log_statement = none                #需要记录的语句,默认只记录错误日志。none,ddl,mod,all
        log_min_duration_statement = 500   #慢查询最小时长,毫秒。log_statement=all同时设置时失效
        shared_preload_libraries = 'auto_explain'       #只需要编译,不需要安装扩展
        auto_explain.log_min_duration = 1s               #超过时长的慢查询,给出执行计划
        postgres=# select pg_reload_conf();
        针对某个用户或数据说库进行设置
        postgres=# alter database db_name set log_min_duration_statement=5000;
        postgres=# alter user user_name set log_min_duration_statement=1000;

3.pg_stat_statementes扩展(推荐)

pg_stat_statements 模块提供了跟踪服务器执行的所有SQL语句的执行统计信息的方法。如果想要开启模块,必须在配置文件中将 pg_stat_statements 添加到 shared_preload_libraries中。因为它需要额外的共享内存,所以必须重启服务添加或删除。当 pg_stat_statements 被加载,会跟踪服务器所有的数据库的统计信息。

为了安全,只有superuser和 pg_read_all_stats role 用户可以访问 SQL text 和 queryid。其他用户可以访问 statistics。

根据内部哈希计算具有相同的查询结构,可计划查询(即SELECT,INSERT,UPDATE和DELETE)就会合并到单个pg_stat_statements条目中。 通常,如果两个查询在语义上等效,则除了查询中出现的文字常量的值之外,它们将被视为相同。 但是,实用命令(即所有其他命令)严格地根据其文本查询字符串进行比较。

安装配置及使用

安装

 cd pg_soft/contrib/pg_stat_statements
        make && make install
        postgres=# create extension pg_stat_statements;

重要配置

 shared_preload_libraries='auto_explain,pg_stat_statements'
        log_min_duration_statement = 100     #慢查询最小时长,毫秒
        track_activity_query_size = 10000     #SQL文本的最大长度
        pg_stat_statements.max = 10000     #跟踪模块中最多保留多少条统计信息,通过LRU算法。
        pg_stat_statements.track = all      #all包括函数内的SQL, top不包含函数内的sql), none
        pg_stat_statements.track_utility = true     #是否跟踪非DML语句 (例如DDL,DCL)
        pg_stat_statements.save = true     #表示当pg停止时,把信息存入磁盘文件。

使用

#重置统计信息
select pg_stat_statements_reset() ;
#最慢的TOP10
SELECT * FROM pg_stat_statements order by total_time desc limit 10;

4.捕获当前连接中的查询

select *
from pg_stat_activity
where state<>'idle' and now()-query_start > interval '1 s' order by query_start ;

到此这篇关于PostgreSQL开启慢查询日志的方法详解的文章就介绍到这了,更多相关PostgreSQL慢查询日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL数据库timestamp数据类型精度进位问题解析

    PostgreSQL数据库timestamp数据类型精度进位问题解析

    PostgreSQL是一款功能强大的开源关系型数据库管理系统,起源于1986年的POSTGRES项目,它支持多种数据类型,包括数值类型、字符串类型、日期时间类型等,本文介绍PostgreSQL数据库timestamp数据类型精度进位问题,感兴趣的朋友一起看看吧
    2024-11-11
  • sqoop读取postgresql数据库表格导入到hdfs中的实现

    sqoop读取postgresql数据库表格导入到hdfs中的实现

    这篇文章主要介绍了sqoop读取postgresql数据库表格导入到hdfs中的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 深入理解PostgreSQL的MVCC并发处理方式

    深入理解PostgreSQL的MVCC并发处理方式

    这篇文章主要介绍了深入理解PostgreSQL的MVCC并发处理方式,文中同时介绍了MVCC的缺点,需要的朋友可以参考下
    2014-07-07
  • PostgreSQL:string_agg 多列值聚合成一列的操作示例

    PostgreSQL:string_agg 多列值聚合成一列的操作示例

    PostgreSQL中的STRING_AGG()函数是一个聚合函数,用于连接字符串列表并在字符串之间放置分隔符,这篇文章主要介绍了PostgreSQL:string_agg多列值聚合成一列,需要的朋友可以参考下
    2023-08-08
  • PostgreSQL无法查看表中数据问题的原因和解决方法

    PostgreSQL无法查看表中数据问题的原因和解决方法

    在 PostgreSQL 中,恢复数据库后,使用 DBeaver 等工具可以看到数据库和表名,但无法查询到表中数据,可能有很多原因,本文给大家分析了PostgreSQL无法查看表中数据问题的原因和解决方法,需要的朋友可以参考下
    2025-04-04
  • postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的问题

    postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的问题

    这篇文章主要介绍了postgresql数据库 timescaledb 时序库 把大数据量表转换为超表,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • PostgreSQL中pageinspect 的扩展使用小结

    PostgreSQL中pageinspect 的扩展使用小结

    pageinspect是PostgreSQL的底层扩展,允许数据库管理员和开发者直接检查数据库页面的内部结构,需超级用户权限,适用于9.6+版本,感兴趣的可以了解一下
    2025-06-06
  • PostgreSQL字符切割:substring函数的用法说明

    PostgreSQL字符切割:substring函数的用法说明

    这篇文章主要介绍了PostgreSQL字符切割:substring函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • postgresql分页数据重复问题的深入理解

    postgresql分页数据重复问题的深入理解

    这篇文章主要给大家介绍了关于postgresql分页数据重复问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用postgresql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • PostgreSQL基础知识之SQL操作符实践指南

    PostgreSQL基础知识之SQL操作符实践指南

    这篇文章主要给大家介绍了关于PostgreSQL基础知识之SQL操作符实践的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05

最新评论