首页 > 数据库 >Q:在PostgreSQL中跟踪和分析查询日志

Q:在PostgreSQL中跟踪和分析查询日志

时间:2024-07-08 15:19:16浏览次数:9  
标签:语句 PostgreSQL log 查询 statement 设置 日志

在PostgreSQL中,跟踪和分析查询日志是排查性能瓶颈的重要步骤。

通过查看和分析查询日志,我们可以了解哪些查询在执行时遇到了问题,例如执行时间过长、资源消耗过大等。

以下是一些建议和步骤,帮助你有效地跟踪和分析PostgreSQL的查询日志。

 

启用查询日志
首先,你需要启用查询日志功能。这可以通过修改PostgreSQL的配置文件(通常是postgresql.conf)来实现。在配置文件中,找到以下两个参数并进行设置:

logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M.log'
log_statement = 'all' # 可以设置为 'none', 'ddl', 'mod', 'all' 来控制记录的日志级别

将logging_collector设置为on以启用日志收集器,并设置日志的目录和文件名格式。log_statement参数决定了要记录哪些类型的SQL语句,通常设置为'all'以记录所有语句,但你也可以根据需要设置为其他级别。

其他几个重要参数说明:

log_rotation_age = 1440    #minute,多长时间创建新的文件记录日志。0 表示禁扩展。
log_rotation_size = 10240    #kb,文件多大后创建新的文件记录日志。0 表示禁扩展。
log_truncate_on_rotation = on #可重用同名日志文件

修改配置文件后,你需要重启PostgreSQL服务以使更改生效。

 

分析查询日志
一旦你开始收集查询日志,你就可以开始分析这些日志以查找性能问题。以下是一些建议:

1. 查找执行时间长的查询
通过查看日志中每个查询的执行时间,你可以找到执行时间较长的查询。这些查询可能是性能瓶颈的主要来源。你可以使用文本编辑器或命令行工具(如grep和awk)来搜索和排序这些查询。

例如,使用grep和awk来提取执行时间超过1秒的查询:

先切换到对应目录 

cd $PGDATA/pg_log
grep 'duration:' postgresql-*.log | awk '{ if ($4 > 1000) print }'

这个命令会输出所有执行时间超过1秒的查询及其相关信息,包括查询文本和执行时间。你可以根据这些信息进一步分析并优化这些查询。

2. 分析资源消耗
除了执行时间,你还可以查看查询对系统资源的消耗情况,如磁盘I/O、CPU使用率和内存使用情况。这有助于你了解查询是否因为资源争用而变慢。

3. 优化查询
一旦你找到了性能瓶颈的查询,你就可以开始优化这些查询。这可能包括:

  • 优化查询语句,如使用更高效的JOIN方式、减少不必要的子查询等。
  • 创建或调整索引,以加速查询。
  • 调整数据库配置参数,以优化性能。

 

跟踪SQL慢语句

postgresql.conf需要设置以下参数:

log_statement = all    #需设置跟踪所有语句,否则只能跟踪出错信息
log_min_duration_statement = 5000    #milliseconds,记录执行5秒及以上的语句

注:当 log_statement=all 和 log_min_duration_statement 同时设置时,将跟踪所有语句,忽略log_min_duration_statement 设置。所以需按情况设置其中一个或两个值。

数据库执行加载配置

select pg_reload_conf();
show log_min_duration_statement;

针对某个用户或者某数据库(test)进行设置

 alter database test set log_min_duration_statement=5000; 

捕获正在查询的慢SQL

--执行时间超过 10s 的语句
select * from pg_stat_activity where state<>'idle' and now()-query_start > interval '5 s'
--锁表
SELECT * FROM pg_stat_activity where datname='bms' and wait_event_type='Lock'--limit 10

 

标签:语句,PostgreSQL,log,查询,statement,设置,日志
From: https://www.cnblogs.com/wxp100/p/18289948

相关文章

  • nginx作为反向代理服务器:代理MySQL、Postgresql、Redis及多个TCP服务
    使用Nginx作为反向代理服务器,可以代理MySQL、PostgreSQL、Redis及多个TCP服务。这需要配置Nginx的stream模块。以下是详细的配置步骤:1.确保Nginx支持stream模块首先,确保Nginx已经编译并支持stream模块。运行以下命令检查:nginx-V在输出中查找--with-str......
  • 统一日志管理
    当做负载均衡时,查询日志在多台服务器上比较麻烦 在ThinkPHP5.1中使用阿里云OSSSDK作为日志驱动来统一记录日志,需要完成以下步骤:安装阿里云OSSSDK使用Composer安装阿里云OSSSDK:composerrequirealiyun/oss-sdk-php return[//...'aliyun_oss'......
  • 机械学习—零基础学习日志008(PAC模型)
    PAC模型——概率近似正确模型拿到一个数据,得到一个模型, 是真实的结果。因此  可以表示成预测结果准不准的公式。比方说西瓜切开之后,是不是好西瓜就是y,而这个根据颜色,纹理,根蒂,判断西瓜好不好就是模型f(x)。表示式希望其差别小于一个很小的数,比如说0.0001,那非常准确,......
  • 【后端面试题】【中间件】【NoSQL】MongoDB查询优化3(拆分、嵌入文档,操作系统)
    拆分大文档很常见的一种优化手段,在一些特定的业务场景中,会有一些很大的文档,这些文档有很多字段,而且有一些特定的字段还特别的大。可以考虑拆分这些文档大文档对MongoDB的性能影响还是很大的,就我个人经验而言,认为可以考虑从两个角度出发拆分大文档:按照字段的访问频率拆分:......
  • 基于 LSN 的 PostgreSQL 数据管理与恢复
    在数据管理和恢复中,LSN(LogSequenceNumber)起着至关重要的作用。本文将深入探讨LSN在PITR(时间点恢复)、流复制、日志记录以及数据一致性中的具体应用,并详细介绍如何基于LSN进行时间点恢复。1.基本概念1.1LSNLSN(LogSequenceNumber,日志序列号)是PostgreSQL中用于......
  • sql server数据库触发器记录 数据库中的创建 删除 的操作日志
    sqlserver数据库触发器记录数据库中的创建删除的操作日志1.创建记录日志表SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO/******sqlserver数据库触发器记录数据库中的创建删除的操作日志*/CREATETABLE[dbo].[Trigger_ddl_record]( [Id][int]IDENT......
  • 商城项目库存管理系统采购需求查询------商城项目
    packagecom.alatus.mall.ware.service.impl;importorg.apache.commons.lang.StringUtils;importorg.springframework.stereotype.Service;importjava.util.Map;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.baomidou.mybatisplu......
  • 成绩查询
    进入题目猜测为sql注入直接sqlmap一把梭数据库表内容得到flag......
  • Grafana+Loki+Promtail 日志监控
    目录前置工作用户组(按需创建)GrafanaLokiLoki配置文件Promtail配置文件配置数据源创建仪表盘添加查询项前置工作Centos7关闭防火墙(systemctlstopfirewalld)独立的用户组(可以不创建)用户组(按需创建)#创建用户组groupaddgrafana#新建一个家目录为`/home/grafa......
  • 缓冲器的重要性,谈谈PostgreSQL
    目录一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器一、PostgreSQL是什么PostgreSQL是一种高级的开源关系型数据库管理系统(RDBMS),它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加州大学伯克利分校开发,现在由......