postgres_dba: PostgreSQL 健康诊断工具

John Doe 五月 28, 2026

总觉得 PostgreSQL 社区缺少好用的健康诊断工具?可以来试试 postgres_dba。

目录

专为 PostgreSQL 打造的 34 项诊断报表,可直接在 psql 中使用。 无需代理、后台进程和外部依赖,全程仅依靠 SQL 实现。

支持表膨胀评估、索引健康检测、锁链路分析、自动清理监控、SQL 语句分析、数据损坏检查、缓冲区缓存查看等诸多功能。输入命令 :dba 即可一键启用。

image

快速上手

git clone https://github.com/NikolayS/postgres_dba.git
cd postgres_dba
bash -c "echo \"\\set dba '\\\\\\\\i $(pwd)/start.psql'\" >> ~/.psqlrc"

通过 psql 连接任意 PostgreSQL 服务端,输入 :dba 即可使用。

环境要求:psql 客户端版本 10 及以上,数据库服务端版本无此限制。建议使用最新版 psql 客户端,以获得最佳使用效果。

功能报表

综合信息(编号 0–3)

编号 报表内容
0 节点信息:主从角色、复制延迟、数据库占用空间、临时文件、预写日志、复制槽
1 数据库空间及统计信息
2 表与索引大小、数据行数统计
3 系统负载概况

活动与会话锁

编号 报表内容
a1 按数据库、用户、会话状态分组展示当前连接
l1 轻量级锁链路查询
l2 含等待时长的锁链路查询(需 PostgreSQL 14+,依赖 pg_locks.waitstart

数据膨胀检测

编号 报表内容
b1 数据表膨胀预估
b2 B 树索引膨胀预估
b3 基于 pgstattuple 检测表膨胀(执行开销较高)
b4 基于 pgstattuple 检测 B 树索引膨胀(执行开销较高)
b5 缺失统计信息的数据表(无法评估膨胀情况)

数据损坏检测(基于 amcheck 工具)

编号 锁类型 报表内容
c1 共享访问锁 快速索引检测:支持 B 树、GIN 索引(需 PostgreSQL 18+),生产环境可安全使用
c2 共享访问锁 索引 + 数据表 / TOAST 大字段检测(需 PostgreSQL 14+),运行安全,但会读取全量数据
c3 ⚠️ 共享锁 B 树索引父节点检测,可识别字符集 / 系统库引发的数据损坏,建议仅在数据克隆环境使用
c4 ⚠️⚠️ 共享锁 全量检测:校验数据表、索引及父节点完整性,确保每条数据行都有对应索引

内存相关

编号 报表内容
m1 缓冲区缓存详情(依赖 pg_buffercache,执行开销较高)

索引管理

编号 报表内容
i1 未使用及低频使用索引
i2 冗余索引排查
i3 外键缺失对应索引的检测
i4 无效索引排查
i5 索引清理语句生成(支持执行与回滚)

自动清理(Vacuum)

编号 报表内容
v1 实时 Vacuum 运行状态
v2 自动清理进度与任务队列

任务进度

编号 报表内容
p1 CREATE INDEX(创建索引)/REINDEX(重建索引)进度

SQL 语句分析(基于 pg_stat_statements)

编号 报表内容
s1 按总耗时排序的慢查询
s2 完整 SQL 性能分析报表
s3 按语句类型统计业务负载分布

参数调优与配置

编号 报表内容
t1 PostgreSQL 参数调优建议
t2 自定义存储参数的数据库对象
e1 已安装的扩展插件列表
x1 数据对齐填充分析(实验性功能)
r1 生成随机密码并创建数据库用户
r2 为已有用户重置随机密码

可选依赖扩展

部分报表需要额外安装扩展才能正常使用:

扩展名称 对应报表 安装 / 配置方式
pg_stat_statements s1、s2、s3 配置 shared_preload_libraries = 'pg_stat_statements'
amcheck c1、c2、c3、c4 执行 CREATE EXTENSION amcheck;
pgstattuple b3、b4 执行 CREATE EXTENSION pgstattuple;
pg_buffercache m1 执行 CREATE EXTENSION pg_buffercache;

版本兼容性

项目每次提交都会通过持续集成,在 PostgreSQL 13 ~ 18 版本中完成测试。9.6~12 旧版本可尝试使用,但不再做常态化测试。

支持 pg_monitor 角色权限,大部分报表无需超级管理员权限(数据损坏检测功能需要超级管理员,或手动授予执行权限)。

自定义报表

将后缀为 .sql 的文件放入 sql/ 目录即可添加自定义报表。文件命名规则:<编号>_<名称>.sql

文件首行必须以 -- 开头添加功能描述,该描述会自动展示在功能菜单中。

# 新增/删除报表后,重新生成功能菜单
bash ./init/generate.sh

推荐工具:pspg

搭配 pspg 可大幅优化表格类输出的阅读体验:

\setenv PAGER pspg
\pset border 2
\pset linestyle unicode

参考

postgres_dba: https://github.com/NikolayS/postgres_dba.git