PostgreSQL收集pg_stat_activity記錄的shell工具pg_collect_pgsa

這是一個純腳本工具,用于從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. 數組形式的…