概述
目标读者:DBA、运维。
用途:本文概述了UXDB监控相关内容(统计视图、进度报告、探针、锁、磁盘监控),提出"先看视图 → 再定位问题"的实操路径与关键 SQL。适合作为故障排查与日常巡检的速查手册。
一、统计信息的两大视图族
UXDB 通过统计收集器(配置 track_counts、track_activities 等参数)采集运行数据,通过两类系统视图暴露:
ux_stat_*:逻辑访问统计(表/索引的读、写、删除、扫描次数,行数,清理/分析信息)。ux_statio_*:物理 I/O 统计(磁盘块读取、缓冲区命中),用于判断缓冲区效率。
重要:统计信息非实时。进程仅在进入空闲前上报计数,收集器约每 500ms 报告一次;因此显示值总是略滞后于实际活动。但
ux_stat_activity的当前命令信息是实时的。
二、最常用的诊断视图
1. 当前活动与锁
-- 谁在跑什么
SELECT pid, usename, state, wait_event_type, wait_event,
now() - xact_start AS xact_age, query
FROM ux_stat_activity WHERE state <> 'idle';
-- 当前未决锁
SELECT * FROM ux_locks WHERE NOT granted;
ux_locks 用于查看未解决的锁:定位某个会话/关系上的锁、判断最多未授予锁的关系(竞争源)、评估锁竞争对整体性能的影响。
2. 数据库/表/索引统计
-- 数据库级:提交/回滚、死锁、缓冲区命中
SELECT * FROM ux_stat_database WHERE datname = current_database();
-- 表级:顺序扫描 vs 索引扫描、增删改、vacuum/analyze 次数
SELECT relname, seq_scan, idx_scan, n_tup_ins, n_tup_del,
n_live_tup, n_dead_tup, last_vacuum, last_autovacuum
FROM ux_stat_all_tables WHERE schemaname = 'public';
-- 索引级:索引扫描次数、命中行数
SELECT relname, idx_scan, idx_tup_read, idx_tup_fetch
FROM ux_stat_all_indexes WHERE schemaname = 'public';
-- 缓冲区命中(物理读 vs 缓冲读)
SELECT relname, heap_blks_read, heap_blks_hit
FROM ux_statio_all_tables WHERE schemaname = 'public';
缓冲区效果判断:heap_blks_read 远小于 heap_blks_hit 时,说明缓冲能满足大部分读请求。但需注意:不在 UXDB 缓冲区的数据可能仍驻留内核页缓存,真正物理读会更少。
3. 复制与归档
SELECT * FROM ux_stat_replication; -- 各后备的复制状态、WAL 位点
SELECT * FROM ux_stat_archiver; -- 归档是否成功、失败计数
SELECT * FROM ux_stat_wal_receiver; -- 本机作为后备时的 WAL 接收状态
4. 函数统计
SELECT * FROM ux_stat_user_functions; -- 函数调用次数与总耗时
三、底层统计函数
视图背后是可自定义查询的底层函数:
SELECT ux_stat_get_activity(pid) FROM ux_stat_get_backend_idset() AS pid;
SELECT ux_stat_reset(); -- 重置当前库统计
常用:ux_stat_get_backend_activity、ux_stat_get_backend_pid、ux_stat_get_backend_client_addr、ux_stat_get_backend_wait_event 等。查看视图定义可用 \d+ ux_stat_activity。
四、进度报告
长命令执行进度通过三类视图查看(每个正在执行的后端一行):
| 视图 | 命令 |
|---|---|
ux_stat_progress_create_index |
CREATE INDEX / REINDEX |
ux_stat_progress_vacuum |
VACUUM(含 autovacuum worker) |
ux_stat_progress_cluster |
CLUSTER / VACUUM FULL |
SELECT * FROM ux_stat_progress_vacuum; -- 查看 VACUUM 阶段与已处理堆块
五、动态追踪探针(DTrace / SystemTap)
UXDB 源码内置探针点,供开发与 DBA 动态追踪(默认不编译,需配置时显式开启)。
- 支持 DTrace(Solaris/macOS/FreeBSD/NetBSD/Oracle Linux)与 Linux SystemTap。
- 典型用途:分析事务计数、锁获取、缓冲区读写等。
- 定义新探针需在源码中加
TRACE_UXSINODB_*宏并重新编译。
/* DTrace 示例:统计事务开始次数 */
uxdb$1:::transaction-start { @tx["start"] = count(); }
六、磁盘使用监控
1. 三种监控方式
- SQL 函数:
ux_database_size、ux_table_size、ux_total_relation_size、ux_relation_size、ux_size_pretty等。 oid2name模块:将对象 OID 映射为文件名。- 人工观察系统目录(
ux_class、ux_index)。
-- 数据库大小(人类可读)
SELECT ux_size_pretty(ux_database_size(current_database()));
-- TOP 10 大表
SELECT relname, ux_size_pretty(ux_total_relation_size(oid))
FROM ux_class WHERE relkind = 'r'
ORDER BY ux_total_relation_size(oid) DESC LIMIT 10;
2. TOAST
宽列(大字段)会拆到关联的 TOAST 文件。每个表/索引独立成文件,超 1GB 会分裂为多个文件。
七、标准 Unix 工具
监控不能只看数据库内部,还需配合 OS 工具:
ps/top:进程与 CPU;UXDB 会修改进程标题(如uxdb: user db SELECT)便于识别。iostat/vmstat:磁盘与内存 I/O。- 发现慢查询后用
EXPLAIN (ANALYZE, BUFFERS)深入。
总结
本文梳理了 UXDB 从统计视图、活动与锁、进度报告、动态探针到磁盘监控的诊断体系的核心要点。
其价值在于"一条诊断路径 + 一个关键认知":诊断路径是"先 ux_stat_activity 看谁在跑、卡在哪 → 再 ux_locks 看是否锁竞争 → 最后 ux_stat_all_tables/indexes + EXPLAIN 定位慢查询";关键认知是统计视图是滞后快照,进度报告与活动视图才是实时的,因此在判断性能问题时应以 ux_stat_activity 的实时命令信息为准,而非依赖滞后统计。掌握这套顺序,即可在绝大多数场景下快速定位瓶颈。




