本文主要是介绍pg ash自制版 pg_active_session_history,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、 实现功能
由于pgsentinel插件存在严重的内存占用问题,本篇改为自行实现,但其语句仍可以参考pgsentinel插件。PostgreSQL ash —— pgsentinel插件 学习与踩坑记录_CSDN博客
v1.0 根据pg 14版本设计及测试,仅支持收集主库信息。默认每10秒收集一次 active与idle in transaction 状态会话信息,保留两个月。
二、 历史会话与阻塞信息
参考 pgsentinel插件的pg_active_session_history视图及pg pg_stat_activity视图,根据不同版本,其中部分字段的值可能为空。
pg_ash表
列名 | 数据类型 | 字段含义 |
---|---|---|
ash_time | timestamp with time zone | 采样时间 |
datid | oid | 会话连接的dbid |
datname | name | 会话连接的DB名 |
pid | integer | 会话进程ID |
leader_pid | integer | 并行进程leader id,pg 13新增 |
usesysid | oid | user id |
usename | name | 用户名 |
application_name | text | 应用程序名 |
client_addr | inet | 客户端ip |
client_hostname | text | 客户端主机名 |
client_port | integer | 客户端端口 |
backend_start | timestamp with time zone | 会话连接到服务器的时间 |
xact_start | timestamp with time zone | 当前事务开始的时间,若无活跃事务则为 NULL |
query_start | timestamp with time zone | 当前活跃查询的开始时间。如果state不为active,则表示上个查询的开始时间 |
state_change | timestamp with time zone | state上次更改的时间 |
wait_event_type | text | 正在等待的事件类型(如果有) |
wait_event | text | 正在等待的事件名(如果有) |
state | text | 当前会话状态 |
backend_xid | xid | 该会话的顶层事务id(如果有) |
backend_xmin | xid | 该会话的xmin horizon |
query | text | active状态下,为当前正在执行的查询;其他状态下,表示最后执行的查询。 默认情况下,查询文本被截断为 1024 字节(由参数track_activity_query_size控制) |
query_id | bigint | 查询id,类似Oracle的sql_id,pg 14新增 |
backend_type | text | 当前会话类型,例如client backend, checkpointer, startup, walreceiver... pg 10新增 |
blockers | integer | 阻塞者数量 |
blockerpid | integer | 阻塞者进程id |
blocker_state | text | 阻塞者状态 |
三、 表结构创建
1. 按月进行分区
|
2. 定期自动新增分区
3. 自动清理旧分区
四、 数据插入
vi pg_ash.sh
|
五、 设置定时执行
由于crontab最小只能按分钟执行,这里利用while true+sleep实现每十秒执行。
vi run.sh 与pg_ash.sh放在相同目录
|
后台运行run.sh
|
六、 测试运行效果
1. pgbench压测
- 初始化数据
|
- 压测脚本
vi test.sql
|
- 执行压测
|
2. 运行ash脚本
|
3. 查询ash数据
|
参考:
PostgreSQL Observability
GitHub - pgsentinel/pgsentinel: postgresql extension providing Active session history
这篇关于pg ash自制版 pg_active_session_history的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!