前言
本篇我们介绍HaloDB中如何使用视图来监控,在大数据和复杂查询日益普遍的今天,为了应对海量数据的查询,对于一款成熟的商业化产品来说,对数据库监控的能力显得格外重要,并且在运维方面扮演着至关重要的角色。本文将详细介绍HaloDB中提供的详细监控视图,帮助数据库管理员和开发人员更好地熟悉HaloDB。
号外,HaloDB 16 已经正式发布,如果对新版本感兴趣的朋友请移步 https://www.modb.pro/doc/132036 后续会推出HaloDB 16版本的解读。
广告时间:
HaloDB 认证培训他来了!!!感兴趣的朋友可以下方扫码进群关注~~~
如果有对我们的产品感兴趣的朋友可以通过主页的联系方式与我取得联系,获取license来安装体验,目前已经开通HaloDB吐槽群,欢迎来喷,进群请私聊我获取。
个人公众号:张某人的DBA菜谱
一、pg_stat_activity:
pg_stat_activity视图是实例维护的一个进程相关的视图,每一行都表示一个系统进程,并显示与该进程相关的活动信息,如当前会话的状态、执行的查询等。
(1)主要字段及其说明:
- datid:数据库的OID(对象标识符)。
- datname:当前活动的数据库名称。
- pid:后端进程的进程ID。
- usesysid:用户的OID。
- usename:当前会话的用户名。
- application_name:应用程序的名称。
- client_addr:客户端的IP地址。
- client_hostname:客户端的主机名(如果可用)。
- client_port:客户端使用的端口。
- backend_start:后端进程启动的时间。
- xact_start:当前事务的开始时间。
- query_start:当前查询的开始时间。
- state_change:会话状态最后一次改变的时间。
- wait_event_type:当前等待事件的类型。
- wait_event:当前等待的具体事件。
- state:当前会话的状态(如active、idle等)。
- backend_xid:后台进程的当前事务ID(如果有)。
- backend_xmin:后台进程的最小事务ID(对长期运行事务有用)。
- query:当前执行的查询语句。

(2)使用场景:
包括但是不限于以下使用方式:
- 监控当前活动的连接:
SELECT pid, usename, datname, client_addr, state, query FROM pg_stat_activity;

- 识别长时间运行的查询:
SELECT pid, usename, datname, client_addr, state, query, age(now(), backend_start) AS age
FROM pg_stat_activity
WHERE state='active' AND age(now(), backend_start) > interval '5 minutes';

- 分析等待事件
SELECT pid, usename, datname, client_addr, query, state, wait_event_type, wait_event
FROM pg_stat_activity
WHERE state='active' AND wait_event_type IS NOT NULL;

二、pg_stat_bgwriter:
该视图可以监控后台写入进程的统计信息,后台写进程的主要任务是将脏数据(dirty data)从共享缓冲区(shared buffer)写入磁盘,(如果有朋友对Halo的系统架构不熟悉的可以看之前的文章)。pg_stat_bgwriter视图通过提供一系列统计信息,帮助数据库管理员监控后台写进程的工作效率,以及缓冲区的管理情况。这些信息对于性能调优和问题诊断具有重要意义,可以快速帮助我们DBA以及系统架构师迅速定位产品问题。
(1)主要字段及其说明
- datid:数据库的OID(对象标识符)。
- datname:当前活动的数据库名称。
- pid:后端进程的进程ID。
- usesysid:用户的OID。
- usename:当前会话的用户名。
- application_name:应用程序的名称。
- client_addr:客户端的IP地址。
- client_hostname:客户端的主机名(如果可用)。
- client_port:客户端使用的端口。
- backend_start:后端进程启动的时间。
- xact_start:当前事务的开始时间。
- query_start:当前查询的开始时间。
- state_change:会话状态最后一次改变的时间。
- wait_event_type:当前等待事件的类型。
- wait_event:当前等待的具体事件。
- state:当前会话的状态(如active、idle等)。
- backend_xid:后台进程的当前事务ID(如果有)。
- backend_xmin:后台进程的最小事务ID(对长期运行事务有用)。
- query:当前执行的查询语句。
(2)使用场景:
- 监控后台写进程的性能:该视图的buffers_clean 列显示了后台写进程在检查点之外写入的缓冲区数量。如果这个数字很高,说明后台写进程正在积极清理脏页。
- 调优检查点配置:checkpoints_timed 和 checkpoints_req 列分别显示了因达到时间间隔和特定条件而触发的检查点次数。这些信息可以帮助用户评估检查点配置的合理性。
SELECT
checkpoints_timed,
checkpoints_req,
checkpoint_write_time,
checkpoint_sync_time,
buffers_checkpoint,
buffers_clean,
maxwritten_clean,
buffers_backend,
buffers_backend_fsync,
buffers_alloc,
stats_reset
FROM
pg_stat_bgwriter;

重置统计信息:
SELECT pg_stat_reset_shared('bgwriter');

三、pg_stat_replication
pg_stat_replication 视图的主要作用是显示主服务器上当前正在进行的复制会话的信息。这些信息包括复制会话的连接状态、延迟情况、同步优先级等,对于数据库管理员来说至关重要。通过监控这些信息,管理员可以及时发现并处理复制过程中的问题,确保数据的完整性和一致性。

(1)主要字段及其说明:
- pid:复制相关的后台进程的进程 ID。
- usesysid:发起该复制会话的用户的 OID(对象标识符)。
- usename:发起该复制会话的用户名称。
- application_name:复制客户端在启动时设置的应用名称。
- client_addr:客户端的 IP 地址,如果连接是通过 Unix 域套接字创建的,则此字段为空。
- client_hostname:客户端的主机名,如果连接没有主机名解析,则此字段为空。
- client_port:客户端的端口号。
- backend_start:后台进程启动的时间。
- backend_xmin:发送者的最早未提交事务的 ID。
- state:连接的状态。可能的值包括 ‘startup’(启动中)、‘catchup’(追赶中)、‘streaming’(流复制中)、‘backup’(备份中)、‘killed’(已杀死)等。这个字段可以帮助管理员了解复制会话的当前状态。
- sent_lsn:主服务器最新传递给副本的 WAL(Write-Ahead Logging)位置。这个字段提供了关于 WAL 日志传递的信息。
- write_lsn:副本确认已经写入的最后一个 WAL 的位置。这个字段表示副本已经接收并写入了多少 WAL 日志。
- flush_lsn:副本确认已经持久化到存储的最后一个 WAL 的位置(即已经同步到磁盘)。这个字段表示副本已经将多少 WAL 日志持久化到磁盘上。
- replay_lsn:副本确认已经应用的最后一个 WAL 的位置。这个字段表示副本已经应用了多少 WAL 日志到数据库中。
- write_lag:副本写入延迟。这个字段表示主库已落盘但等待备库落盘的时间。
- flush_lag:副本持久化延迟。这个字段表示 WAL 日志流已写入备库但还没有被确认的时间。
- replay_lag:副本应用延迟。这个字段表示备库已应用 WAL 日志并返回确认信息的时间。
- sync_priority:同步优先级。这个字段表示副本的同步优先级,用于在主库故障时选择同步副本。
- sync_state:副本的同步状态。可能的值包括 ‘async’(异步)、‘sync’(同步)、‘potential’(潜在同步)等。这个字段表示副本当前的同步状态。
(2)使用场景
- 监控复制状态:
查看当前复制会话
SELECT * FROM pg_stat_replication;
- 查看特定复制会话的详细信息
SELECT * FROM pg_stat_replication WHERE application_name = 'your_application_name';
- 查看复制延迟
SELECT application_name, client_addr, write_lag, flush_lag, replay_lag FROM pg_stat_replication;
- 查看优先级和同步状态
SELECT application_name, sync_priority, sync_state FROM pg_stat_replication ORDER BY sync_priority DESC;

四、pg_stat_user_tables
pg_stat_user_tables 视图提供了关于用户定义的表相关信息,该视图的主要作用是显示用户表信息,包括表的访问情况、修改情况以及其他性能指标。这些信息可以帮助数据库管理员了解表的使用模式,识别性能瓶颈,并采取相应的优化措施。
(1)主要字段及其含义
- schemaname:表所属的模式名称。
- relname:表的名称。
- seq_scan:顺序扫描表的次数。顺序扫描是指数据库引擎从头开始扫描整个表以查找匹配的记录。
- seq_tup_read:通过顺序扫描从表中读取的行数。
- idx_scan:索引扫描表的次数。索引扫描是指数据库引擎使用索引来查找匹配的记录,这通常比顺序扫描更快。
- idx_tup_fetch:从索引中检索的行数。
- n_tup_ins:向表中插入的行数。
- n_tup_upd:更新表中的行数。
- n_tup_del:从表中删除的行数。
- n_live_tup:表中当前存活的行数。存活行数是指表中尚未被删除的行数。
- n_dead_tup:表中当前已删除的行数。已删除行数是指表中已经被删除但尚未通过 VACUUM 操作清理的行数。
- last_vacuum:上次手动执行 VACUUM 操作的时间。
- last_autovacuum:上次自动执行 VACUUM 操作的时间。
- vacuum_count:手动执行 VACUUM 操作的次数。
- autovacuum_count:自动执行 VACUUM 操作的次数。

(2)使用场景与示例:
- 监控表的性能
SELECT schemaname, relname, seq_scan, seq_tup_read, idx_scan, idx_tup_fetch, n_tup_ins, n_tup_upd, n_tup_del, n_live_tup, n_dead_tup FROM pg_stat_user_tables;

- 查询特定表统计信息
SELECT * FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname = 'your_table_name';

- 查看需要进行 VACUUM 的表
SELECT schemaname, relname, n_live_tup, n_dead_tup FROM pg_stat_user_tables WHERE n_dead_tup > 1000; -- 此处条件可根据实际需求调整

- 统计表的更新/插入/删除操作
SELECT schemaname, relname, n_tup_ins AS inserts, n_tup_upd AS updates, n_tup_del AS deletes FROM pg_stat_user_tables ORDER BY inserts DESC;

最后
虽然是慢工,但是不是什么细活,下期见~





