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 日志文件的所在位置

    PostgreSQL 日志文件的所在位置

    这篇文章主要介绍了PostgreSQL 日志文件的所在位置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql创建新增、删除与修改触发器的方法

    Postgresql创建新增、删除与修改触发器的方法

    这篇文章主要介绍了Postgresql创建新增、删除与修改触发器的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 启动PostgreSQL服务器 并用pgAdmin连接操作

    启动PostgreSQL服务器 并用pgAdmin连接操作

    这篇文章主要介绍了启动PostgreSQL服务器 并用pgAdmin连接操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • pgsql 如何手动触发归档

    pgsql 如何手动触发归档

    这篇文章主要介绍了pgsql手动触发归档的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Docker环境下升级PostgreSQL的步骤方法详解

    Docker环境下升级PostgreSQL的步骤方法详解

    这篇文章主要介绍了Docker环境下升级PostgreSQL的步骤方法详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 如何查看PostgreSQL数据库中所有表

    如何查看PostgreSQL数据库中所有表

    这篇文章主要介绍了如何查看PostgreSQL数据库中所有表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Postgresql导入几何数据(shp,geojson)的几种方式

    Postgresql导入几何数据(shp,geojson)的几种方式

    本文主要介绍了Postgresql导入几何数据(shp,geojson)的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-02-02
  • postgresql如何找到表中重复数据的行并删除

    postgresql如何找到表中重复数据的行并删除

    这篇文章主要介绍了postgresql如何找到表中重复数据的行并删除问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Postgresql锁机制详解(表锁和行锁)

    Postgresql锁机制详解(表锁和行锁)

    这篇文章主要介绍了Postgresql锁机制详解(表锁和行锁),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL实战之启动恢复读取checkpoint记录失败的条件详解

    PostgreSQL实战之启动恢复读取checkpoint记录失败的条件详解

    这篇文章主要给大家介绍了关于PostgreSQL实战之启动恢复读取checkpoint记录失败的条件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-08-08

最新评论