pgsentinel

活跃会话历史

概览

扩展包名版本分类许可证语言
pgsentinel1.4.2STATPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
6410pgsentinel-
相关扩展system_stats pgnodemx pg_stat_monitor pg_wait_sampling bgw_replstatus pg_profile pg_proctab powa

Package/source release and PIGSTY RPM are 1.4.2; shipped pgsentinel.control and PGDG DEB remain 1.4.1.

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.4.21817161514pgsentinel-
RPMPIGSTY1.4.21817161514pgsentinel_$v-
DEBPGDG1.4.21817161514postgresql-$v-pgsentinel-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 pgsentinel 扩展的 RPM / DEB 包:

pig build pkg pgsentinel         # 构建 RPM / DEB 包

安装

您可以直接安装 pgsentinel 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgsentinel;          # 当前活跃 PG 版本安装
pig ext install -y pgsentinel -v 18  # PG 18
pig ext install -y pgsentinel -v 17  # PG 17
pig ext install -y pgsentinel -v 16  # PG 16
pig ext install -y pgsentinel -v 15  # PG 15
pig ext install -y pgsentinel -v 14  # PG 14
dnf install -y pgsentinel_18       # PG 18
dnf install -y pgsentinel_17       # PG 17
dnf install -y pgsentinel_16       # PG 16
dnf install -y pgsentinel_15       # PG 15
dnf install -y pgsentinel_14       # PG 14
apt install -y postgresql-18-pgsentinel   # PG 18
apt install -y postgresql-17-pgsentinel   # PG 17
apt install -y postgresql-16-pgsentinel   # PG 16
apt install -y postgresql-15-pgsentinel   # PG 15
apt install -y postgresql-14-pgsentinel   # PG 14

预加载配置

shared_preload_libraries = 'pgsentinel';

创建扩展

CREATE EXTENSION pgsentinel;

用法

来源:

pgsentinel 通过在固定时间间隔内采样 pg_stat_activity 并将活动与 pg_stat_statements 查询统计信息关联来记录活跃会话历史。它最近的样本存储在由后台工作进程管理的共享内存环形缓冲区中。

shared_preload_libraries = 'pg_stat_statements,pgsentinel'
pg_stat_statements.track = all
pgsentinel.db_name = 'postgres'

重启 PostgreSQL,然后在用于工作的数据库中启用这两个扩展:

CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION pgsentinel;

活跃会话历史

SELECT ash_time, datname, usename, pid, state,
       wait_event_type, wait_event, query, queryid
FROM pg_active_session_history
ORDER BY ash_time DESC;

除了 pg_stat_activity 之外的关键列:

描述
ash_time采样时间戳
top_level_queryPL/pgSQL 的顶级语句(如果适用)
query包含实际参数值的语句
cmdtype语句类型:SELECT, UPDATE, INSERT, DELETE, UTILITY, UNKNOWN, NOTHING
queryidpg_stat_statements 的链接
blockers阻塞进程的数量
blockerpid阻塞进程的 PID
blocker_state阻塞者的状态

查询统计历史

启用时,pgsentinel 还会并发地采样 pg_stat_statements

SELECT ash_time, queryid, calls, total_exec_time, rows,
       shared_blks_hit, shared_blks_read
FROM pg_stat_statements_history
ORDER BY ash_time DESC;

示例:等待分析

-- Top wait events in the last hour
SELECT wait_event_type, wait_event, count(*)
FROM pg_active_session_history
WHERE ash_time > now() - interval '1 hour'
  AND wait_event IS NOT NULL
GROUP BY 1, 2
ORDER BY 3 DESC;

-- Blocking analysis
SELECT blockerpid, blocker_state, count(*)
FROM pg_active_session_history
WHERE blockers > 0
GROUP BY 1, 2
ORDER BY 3 DESC;

配置

参数默认值描述
pgsentinel_ash.sampling_period1每秒采样周期
pgsentinel_ash.max_entries1000ASH 的环形缓冲区大小
pgsentinel.db_namepostgres工作连接的数据库
pgsentinel_ash.track_idle_transfalse跟踪 idle-in-transaction 会话
pgsentinel_pgssh.max_entries1000pg_stat_statements 历史的环形缓冲区大小
pgsentinel_pgssh.enablefalse启用 pg_stat_statements 历史

版本和操作注意事项

  • 发行版 1.4.2 修复了 PostgreSQL 17 上的查询统计历史问题,其 pg_stat_statements 视图将阻塞 I/O 时间列重命名为 shared_blk_read_timeshared_blk_write_time
  • 同一发行版在不改变 SQL 视图或 GUC 表面的情况下增加了对 PostgreSQL 19 的构建兼容性。
  • 环形缓冲区历史是内存驻留且有限的;只有在考虑共享内存使用情况后才能增加条目限制,并在需要更长保留时间时导出样本。
  • 查询文本可以包含字面量参数值。当语句可能包括敏感数据时,应限制对历史视图的访问。