这是一个纯脚本工具,用于从PostgreSQL的pg_stat_activity视图中定期收集数据并保存到本地日志文件。

相关背景

  1. 某个慢SQL打满内存,导致系统kill掉postgres的某个进程,进而导致postgres进程重启,没有现场排查不了具体原因。(即使开启了慢SQL日志,没有执行完也不会记录到数据库日志中)
  2. 数据库连接数被打满,PG相关监控数据丢失(因为也连不上数据库了),没有现场,不知道异常请求来源。

特性

  • 定期收集PostgreSQL活动会话信息
  • 支持通过定时任务配置收集频率
  • 提供日志文件自动分割功能
  • 包含丰富的日志分析示例

安装指南

拉取代码,修改参数,设置定时任务。

# 克隆代码
git clone git@github.com:yansheng836/pg_collect_pgsa.git
cd pg_collect_pgsa# 修改必要参数(均以 PG_ 开头,例如:PG_PATH、PG_HOST 等)
vi pg_collect_pgsa.sh# 查路径
pwd# crontab -e
# 每分钟执行
* * * * * pwd路径/pg_collect_pgsa.sh# 每5秒执行(可自行调整秒数)
* * * * * pwd路径/pg_collect_pgsa_gap_second.sh 5

日志文件内容

测试版本:PostgreSQL 16.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit

输出字段为:now(),datid, datname, pid, leader_pid, usesysid, usename, application_name, client_addr, client_hostname, client_port, backend_start, xact_start, query_start, state_change, wait_event_type, wait_event, state, backend_xid, backend_xmin, query_id, query, backend_type

2025-08-28 13:02:22.151458+08|||29360||||||||2025-08-12 13:58:41.03657+08||||Activity|CheckpointerMain||||||checkpointer
2025-08-28 13:02:22.151458+08|||29361||||||||2025-08-12 13:58:41.036868+08||||Activity|BgWriterHibernate||||||background writer
2025-08-28 13:02:22.151458+08|||29363||||||||2025-08-12 13:58:41.043339+08||||Activity|WalWriterMain||||||walwriter
2025-08-28 13:02:22.151458+08|||29365||10|postgres|||||2025-08-12 13:58:41.04334+08||||Activity|LogicalLauncherMain||||||logical replication launcher
2025-08-28 13:02:22.151458+08|||29364||||||||2025-08-12 13:58:41.043811+08||||Activity|AutoVacuumMain||||||autovacuum launcher
2025-08-28 13:02:22.151458+08|5|postgres|6583||10|postgres|Navicat|42.99.63.72||36481|2025-08-28 12:34:20.191304+08||2025-08-28 12:47:55.618303+08|2025-08-28 12:47:55.619804+08|Client|ClientRead|idle|||7982016161531118154|SELECT now(),datid, datname, pid, leader_pid, usesysid, usename, application_name, client_addr, client_hostname, client_port, backend_start, xact_start, query_start, state_change, wait_event_type, wait_event, state, backend_xid, backend_xmin, query_id, query, backend_type from pg_stat_activity WHERE pid <> pg_backend_pid() ORDER BY backend_start ASC|client backend
2025-08-28 13:02:22.151458+08|5|postgres|6611||10|postgres|Navicat|42.99.63.72||36773|2025-08-28 12:34:26.810414+08||2025-08-28 12:47:55.670278+08|2025-08-28 12:47:55.670683+08|Client|ClientRead|idle|||7746404270258954630|SELECT c.conkey FROM pg_constraint c WHERE c.contype = 'p' and c.conrelid = 12222|client backend
2025-08-28 13:02:23.339309+08|||29360||||||||2025-08-12 13:58:41.03657+08||||Activity|CheckpointerMain||||||checkpointer
2025-08-28 13:02:23.339309+08|||29361||||||||2025-08-12 13:58:41.036868+08||||Activity|BgWriterHibernate||||||background writer
2025-08-28 13:02:23.339309+08|||29363||||||||2025-08-12 13:58:41.043339+08||||Activity|WalWriterMain||||||walwriter
2025-08-28 13:02:23.339309+08|||29365||10|postgres|||||2025-08-12 13:58:41.04334+08||||Activity|LogicalLauncherMain||||||logical replication launcher
2025-08-28 13:02:23.339309+08|||29364||||||||2025-08-12 13:58:41.043811+08||||Activity|AutoVacuumMain||||||autovacuum launcher
2025-08-28 13:02:23.339309+08|5|postgres|6583||10|postgres|Navicat|42.99.63.72||36481|2025-08-28 12:34:20.191304+08||2025-08-28 12:47:55.618303+08|2025-08-28 12:47:55.619804+08|Client|ClientRead|idle|||7982016161531118154|SELECT now(),datid, datname, pid, leader_pid, usesysid, usename, application_name, client_addr, client_hostname, client_port, backend_start, xact_start, query_start, state_change, wait_event_type, wait_event, state, backend_xid, backend_xmin, query_id, query, backend_type from pg_stat_activity WHERE pid <> pg_backend_pid() ORDER BY backend_start ASC|client backend
2025-08-28 13:02:23.339309+08|5|postgres|6611||10|postgres|Navicat|42.99.63.72||36773|2025-08-28 12:34:26.810414+08||2025-08-28 12:47:55.670278+08|2025-08-28 12:47:55.670683+08|Client|ClientRead|idle|||7746404270258954630|SELECT c.conkey FROM pg_constraint c WHERE c.contype = 'p' and c.conrelid = 12222|client backend

日志分析参考

1.简单检索

# cat/more/less/grep 
grep 'idle' pgsa.log# 查找具体时间的相关日志
grep '2025-09-04 12:59' pgsa.log# 在归档日志中,查找具体时间的相关日志
zless logs/pgsa-20250904-12.log.gz  | grep '2025-09-04 12:59'

2.统计不同状态的语句的数量

# 第18列是状态:state
awk -F '|' '{print $18}' pgsa.log | sort | uniq -c10 4 idle

3.按照时间统计

# 按天统计
awk -F '|' '{print $1}' pgsa.log | cut -d ' ' -f1 | sort | uniq -c14 2025-08-28
# 按小时统计
awk -F '[| ]' '{print $1 " " $2}' pgsa.log | cut -d: -f1 | sort | uniq -c7 2025-08-28 127 2025-08-28 14
# 按分钟统计
awk -F '[| ]' '{print $1 " " $2}' pgsa.log | cut -d: -f1-2 | sort | uniq -c7 2025-08-28 12:597 2025-08-28 14:09

注意事项

  1. 在业务繁忙的数据库上使用时,需要注意日志文件可能会快速增长,建议在特殊情况下短暂使用,并密切关注磁盘空间。
  2. query字段的长度受PostgreSQL参数track_activity_query_size限制,默认为1024,超出部分会被截断。修改此参数需要重启数据库服务。
  3. 账号权限问题,可不使用postgres。推荐最小权限:[创建空库,]创建普通用户,授予pg_read_all_stats角色即可。
    -- CREATE DATABASE pgsadb;
    CREATE USER pgsa_user with password 'your password';
    GRANT pg_read_all_stats TO pgsa_user;
    

仓库

详见:

GitHub:https://github.com/yansheng836/pg_collect_pgsa

Gitee:https://gitee.com/yansheng0083/pg_collect_pgsa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95865.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95865.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95865.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通俗的话语解读《银行保险机构信息科技外包风险监管办法》

这份文件不是 “纸上规矩”&#xff0c;而是银行保险机构做信息科技外包的 “实操手册”—— 从要不要外包、选谁合作&#xff0c;到怎么管过程、防风险&#xff0c;再到出问题怎么应对&#xff0c;都给了明确方向。作为管理者&#xff0c;核心是把这些要求落地到日常决策和系统…

芯片ATE测试PAT(Part Average Testing)学习总结-20250916

目录 一、基本概念 二、静态PAT 三、动态PAT 四、参考链接: 一、基本概念 零件平均测试(Part Average Testing,PAT)是一种基于统计学的质量控制方法,主要用于半导体制造中筛选出与正常参数范围偏差较大的“异常值”芯片,以提高产品质量和可靠性; 二、静态PAT 静态…

【数据结构、java学习】数组(Array)

1&#xff0c;概念 数组一旦定义&#xff0c;其维数和维界就不再改变。 因此除了结构的初始化和销毁之外&#xff0c;数组只有存取元素和修改元素值的操作。Array可以存放对象类型、基本数据类型的数据。数组中元素在内存中按顺序线性存放&#xff0c;通过第一个元素就能访问随…

58-正则表达式

1. 概念正则表达式是一种用来匹配字符串的强有力的武器.设计思想&#xff1a;用一种描述性的语言来给字符串定义一个规则&#xff0c;凡是符合规则的字符串&#xff0c;就认为它"匹配"【合法】否则就是不匹配[不合法]举例&#xff1a;beijinglishao163.com2. 规则 1.…

图片木马制作的三种方法

本文转自&#xff1a;https://www.cnblogs.com/cybersecuritystools/p/14932567.html 0x01什么是图片木马&#xff1f; 图片木马在网络上没有统一的定义&#xff0c;在这里我给出自己的定义。图片木马是一张能正常显示又包含恶意代码&#xff08;比如一句话木马&#xff09;的…

【Redis】缓存的穿透、击穿和雪崩

引言要了解缓存的这几个相关问题&#xff0c;我们先以一个例子来引入&#xff1a;有一个get请求&#xff1a;api/news/getById/1正常情况下对其申请访问的流程如图&#xff1a;但若是如此&#xff0c;访问增多或者受到攻击时很容易受到以下问题1 缓存穿透1.1 造成原因当查询一个…

打造一款高稳定、低延迟、跨平台RTSP播放器的技术实践

一、引言 RTSP&#xff08;Real Time Streaming Protocol&#xff09;作为经典的实时流媒体协议&#xff0c;已经深深嵌入到安防监控、远程教育、工业巡检、低空经济、医疗影像传输等行业之中&#xff0c;可以说是这些场景的视频传输“基础设施”。一个稳定的 RTSP 播放器&…

C++_数据结构

数据结构是计算机存储、组织数据的方式&#xff0c;它使得数据能够被高效地访问和修改。根据数据元素之间关系的不同特性&#xff0c;数据结构可以分为多种类型。主要可以分为两大类&#xff1a;逻辑结构和物理结构&#xff08;也称存储结构&#xff09;。 一、逻辑结构&#x…

一个正常的 CSDN 博客账号,需要做哪些基础准备?

一个正常的 CSDN 博客账号&#xff0c;需要做哪些准备&#xff1f; CSDN&#xff08;中国软件开发网&#xff09;作为国内最具影响力的技术社区之一&#xff0c;不仅是开发者获取信息的重要平台&#xff0c;也是技术人建立个人品牌、输出知识、积累影响力的重要阵地。想要把一…

【Python基础】 17 Rust 与 Python 运算符对比学习笔记

一、算术运算符运算符Rust &#x1f980;Python &#x1f40d;示例 (Rust)示例 (Python)说明加法加法let sum 5 3;sum 5 3-减法减法let diff 5 - 3;diff 5 - 3*乘法乘法let product 5 * 3;product 5 * 3/除法除法let quotient 5 / 3; → 1quotient 5 / 3 → 1.666...…

单链表逆序java

在Java中实现单链表的逆序&#xff0c;可以通过迭代或递归两种方式。以下是两种方法的详细实现&#xff1a; 1. 迭代方法&#xff08;推荐&#xff09; public class ListNode {int val;ListNode next;ListNode(int x) { val x; } }class Solution {public ListNode reverseLi…

(11)用于无GPS导航的制图师SLAM(二)

文章目录 前言 7 构建软件包 8 开始制图 9 配置 ArduPilot 10 测试 11 视频 前言 本页展示了如何使用 RPLidarA2 激光雷达(RPLidarA2 lidar)设置 ROS 和 Google Cartographer SLAM&#xff0c;为 ArduPilot 提供本地位置估计&#xff0c;使其可以在没有 GPS 的情况下运行…

1.5、机器学习-回归算法

1、线性回归模型 线性回归模型(Liner Regression)&#xff0c;是利用线性拟合的方式来探寻数据背后的规律。通过搭建线性回归模型&#xff0c;可以寻找这些散点&#xff08;也称样本点&#xff09;背后的趋势线(也称回归曲线)。 借助回归曲线&#xff0c;我们可以进行一些简单…

eclipse 安装 lombok

好久没有用eclipse&#xff0c;新装eclipse 发现lombok 没有生效&#xff0c;如下安装最省事&#xff0c;无需安装plugin等。 进入maven 本地目录&#xff0c;如&#xff1a;org\projectlombok\lombok\1.18.38&#xff0c;点击lombok jar文件指定eclipse 目录&#xff0c;安装完…

linux离线安装elasticsearch8.19.3

下载: 官网多版本下载: Past Releases of Elastic Stack Software | Elastic github多版本下载: https://github.com/elastic/elasticsearch/releases 上传后解压到当前目录 tar -zxvf elasticsearch-8.19.3-linux-x86_64.tar.gz 或指定解压目录 tar -xzf elasticsearch-8…

Uniapp中进行微信小程序头像和昵称的更改

一、官方文档&#xff1a; 1、wx.getUserInfo&#xff08;uni.getUserInfo&#xff09;&#xff1a;基础库版本低于2.27.1可用 ① 文档链接&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.htmlhttps://uniapp.dclou…

交换机详细

交换机&#xff08;Sritch&#xff09;&#xff1a;一种用于电&#xff08;光&#xff09;信号转发的网络设备&#xff0c;可以为接入交换机的任意两个网络节点提供独享的电信号通路。解决什么问题&#xff1f;多台设备之间的数据交换的问题。因此根据它的功能&#xff0c;它通…

功能强大的多线程端口扫描工具,支持批量 IP 扫描、多种端口格式输入、扫描结果美化导出,适用于网络安全检测与端口监控场景

工具介绍 PortScanner - 多线程端口扫描工具&#xff0c;一款功能强大的多线程端口扫描工具&#xff0c;支持批量 IP 扫描、多种端口格式输入、扫描结果美化导出&#xff0c;适用于网络安全检测与端口监控场景。&#x1f31f; 功能特性 &#x1f50d; 灵活的扫描目标&#xff1…

【OpenHarmony文件管理子系统】文件访问接口mod_fileio解析

OpenHarmony文件访问接口mod_fileio解析 概述 mod_fileio模块是OpenHarmony文件管理API中的核心模块之一&#xff0c;提供了完整的文件I/O操作功能。该模块基于Node.js N-API构建&#xff0c;为JavaScript应用提供了丰富的文件系统操作接口&#xff0c;包括文件读写、目录操作、…

js逆向Webpack模块加载机制解析:从数组到JSONP

1. 概述 Webpack作为现代前端开发中最流行的模块打包工具&#xff0c;其模块加载机制值得深入理解。本文将解析Webpack的几种模块加载方式&#xff0c;包括数组形式、键值对形式和JSONP动态加载。只有理解了它的相关加载机制&#xff0c;我们才可以进行逆向工作。 2. 数组形式的…