【免费下载链接】pgbot
Postgres intelligence for ai agents
pgbot 是一款面向 PostgreSQL 的只读数据库诊断工具:一个静态二进制,像psql一样通过标准协议连接托管数据库(RDS、Aurora、Neon、Supabase),读取数据库自身的统计视图,输出"发现项优先"的健康报告。它不在数据库上安装任何东西,全程无写权限——这正是它敢直接连生产库的原因。本文带你从零理解 pgbot 的连接模型,并逐一拆解 RDS、Aurora、Neon、Supabase 四大托管平台的连接要点与排障方法。
连接模型:pgbot 只是一个"客户端" 🧭
很多新手的第一反应是"我要在 RDS 实例上装个 agent"——不需要。pgbot 是纯客户端,运行位置可以是:
- 你的笔记本(公开端点的 RDS / Neon / Supabase)
- 与数据库同 VPC 的一台 EC2
- CI 流水线
- 一台堡垒机 / 跳板机
连接后它做三件关键的事(见 internal/conn/connect.go):
- 能力探测:一次往返读出服务器版本、扩展、角色权限、平台标记;
- 连接池封顶 4 条:每次探测都是独立的
BEGIN READ ONLY … COMMIT短事务,并固定statement_timeout=15s、lock_timeout=2s——诊断工具绝不能变成它要诊断的事故; - 只读身份:真正保证只读的是
pg_monitor只读角色,会话参数只是纵深防御。
平台是如何被自动识别的
pgbot 不需要你手动声明"这是 RDS"。它的检测逻辑(internal/conn/provider.go)综合三路信号:
| 信号 | 示例 |
|---|---|
| 主机名特征 | supabase、neon.tech、rds.amazonaws.com |
version()文本 | 含aurora |
pg_settings厂商标记 | rds.*、cloudsql.*、azure.*、aurora_version() |
第三条信号意味着即使主机是裸 IP 或藏在代理后面,检测依然有效。识别结果直接决定后续的排障建议:缺pg_stat_statements时,pgbot 会打印你所在平台的专属开启步骤,而不是一句泛泛的"请安装扩展"。
想确认检测结论,随时可以执行:
pgbot inspect "$DATABASE_URL" --json | jq .server第一次运行:inspect 快速上手
npx @pgbot/cli inspect "postgres://pgbot_ro@host:5432/db?sslmode=require"推荐把连接串放进环境变量(密码不进入 shell 历史和ps输出):
export DATABASE_URL="postgres://pgbot_ro:…@host:5432/db?sslmode=require" pgbot inspect默认报告是一条"分级体检":四行生命体征仪表(缓存命中、锁等待、回滚、闲置索引)、一行checked列出核查通过的系统、一个健康分,再按 CRITICAL / WARNING / NOTE 分桶列出发现项。
退出码是脚本化契约(对接 CI 时记住它):0正常 ·1警告 ·2严重 ·3连接/执行失败 ·64参数错误。也就是说,连不上库本身就是 exit 3,你的流水线能立刻区分"库有病"和"连不上"。
RDS 连接排障:三种接入方式
私有 RDS(生产库的常态)
RDS 实例没有 OS 权限,无法装任何东西,所以答案永远是"从一个能触达它的位置运行 pgbot":
| 方式 | 适用场景 | 要点 |
|---|---|---|
| ✅ 同 VPC 的 EC2(推荐) | 私有实例 | 走 AWS 内网,数据库无需公网访问;唯一规则是安全组放行 EC2 的5432 |
--ssh-tunnel跳板机 | 不想开 EC2 | 见下文"私有网络一步接入" |
| 笔记本直连 | 公开实例 | 安全组允许你的 IP 即可 |
# 在同 VPC 的 EC2 上(或公开实例的笔记本上): pgbot inspect "postgres://pgbot_ro@mydb.abc123.us-east-1.rds.amazonaws.com:5432/appdb?sslmode=require"授权与开启 pg_stat_statements
pg_monitor:RDS 不开放 OS superuser,但用主用户(rds_superuser)执行GRANT pg_monitor TO <role>;完全可行——这就是 pgbot 的全部所需。pg_stat_statements:把pg_stat_statements加入DB 参数组的shared_preload_libraries,重启实例,再CREATE EXTENSION pg_stat_statements;。缺了它只会让 queries 部分降级,其他检查照常进行。
📌诚实的边界:CPU / 内存 / 磁盘 IOPS 这类主机指标住在 CloudWatch 里,SQL 连接够不到——这是托管数据库的普遍边界,不是 pgbot 的缺陷。除此之外的检查(查询、索引、锁、复制、检查点、连接、配置)全部可用。
加--full会得到一张子系统状态板:每个子系统一行,ok / warn / fail一目了然,fail 行直接点名根因(比如"锁等待 61%,4f2a 被 91c 阻塞")。
Aurora 集群:一次体检全部实例 ⚡
Aurora 有个新手容易踩的坑:集群端点背后是多个实例(一个 writer + N 个 reader),任意一个实例上的pg_stat_*都代表不了其他实例。只连集群端点检查一次,可能漏掉 reader 上的问题。
pgbot inspect "$CLUSTER_URL" --all-instances解决它(internal/conn/aurora.go):
- 用
aurora_replica_status()列出集群成员,writer 排第一; - 从集群端点的 DNS 名推导出每个实例的端点(支持
cluster-、cluster-ro-、cluster-custom-前缀,自定义域名会跟随 CNAME 链解析到真实 RDS 名); - 用
aurora_db_instance_identifier()核验每个推导出的端点确实到达了它声称的那个成员——不猜测; - 逐个实例体检,同一套凭据与 TLS 设置。
整个过程只需要 SQL 和 DNS:不需要 AWS 凭据、CLI、SDK 或 API。它还会拒绝无法推导的端点(如 RDS Proxy——成员藏在代理后面),任何成员不可达都会报"部分覆盖"并以 exit 3 退出,而不是假装全部检查过。
上图正是多实例场景下的重要提醒:在 writer 上"零扫描"的索引,reader 可能还在用——扫描计数是每节点的。pgbot 会在indexes输出里主动带上这条"先别删"的警告。
Neon 连接排障:pooler、channel_binding 与冷窗口
pgbot inspect "postgres://user:pass@ep-xxx.region.aws.neon.tech/dbname?sslmode=require"Neon 上有三个新手最常遇到的现象,pgbot 都已经内置处理:
| 现象 | pgbot 的行为 |
|---|---|
默认连接串带-pooler主机后缀(PgBouncer 事务池) | 自动检测并继续,附一行说明;追求会话级确定性可用去掉-pooler的直连主机 |
默认串带channel_binding=require | 自动忽略(驱动不做 SCRAM 通道绑定),并在 stderr 说明;sslmode的 TLS 依然生效,不会报错中断 |
| Scale-to-zero:闲置后计算层挂起,统计清零 | 冷窗口保护,见下 |
冷窗口(cold window)是 Neon 排障的核心概念。计算层挂起再唤醒后,pg_stat_statements历史、缓存命中计数、索引扫描数全部从 0 开始。如果 pgbot 照搬旧逻辑,计数器从 40M 掉到 12k 会被误报成"−99.97% 的性能回归"。
pgbot 的做法是降级而不是说谎(阈值定义在 internal/model/context.go 的ColdWindowThresholdSeconds,即 15 分钟):
- 统计被重置后,
deltas整节被抑制并附原因——"从 40M 到 12k 是唤醒,不是 −99.97%"; - 窗口不足 15 分钟时,基于计数器的发现项(闲置索引、缓存命中、顺序扫描偏重)被抑制;
- 但即时有效的仪表(阻塞链、idle-in-transaction、复制延迟、无效索引)照常报告;
- 报告头会直白地写明窗口年龄。
想拿到连续历史?关闭 scale-to-zero 或调大挂起超时,让统计在两次运行之间存活。
pg_stat_statements在 Neon 上已预加载,一条CREATE EXTENSION pg_stat_statements;即可。
Supabase 连接排障:直连端点优先
Supabase 给你两种连接串,排障前先分清:
# 直连端点(会话级,pgbot 首选): pgbot inspect "postgres://postgres:pass@db.<ref>.supabase.co:5432/postgres?sslmode=require" # 池化端点(Supavisor 事务池,端口 6543)——也可以,pgbot 会标注并继续: pgbot inspect "postgres://postgres.<ref>:pass@aws-0-<region>.pooler.supabase.com:6543/postgres?sslmode=require"- 默认连接串走
:6543池化端点。pgbot 检测到端口 6543 会自动识别并附注;需要会话级确定性时加--strict-pooler,它会拒绝池化端点并告诉你改用哪个。 - 为什么池化端点也能出正确速率?每个计数器都在自己的事务里读取,而
pg_stat_*是集群级共享内存——哪个后端应答读都无关紧要(实现见 internal/conn/pooler.go)。 - Supabase 不发放 superuser:内置
postgres角色已有较宽的读权限,允许的地方也可以给专用角色授pg_monitor。 pg_stat_statements同样已预加载。- 免费层闲置后会暂停实例——暂停后的首次运行请当作冷窗口看待。
连接排障速查表 🔍
| 症状 | 根因 | 解法 |
|---|---|---|
| exit 3,连接失败 | 安全组 / 白名单 / 端点不可达 | 私有库用同 VPC EC2 或--ssh-tunnel;公开库放行 IP |
| "queries section unavailable" | 缺pg_stat_statements | 按平台步骤开启:RDS/Aurora 改参数组 + 重启;Neon/Supabase 仅CREATE EXTENSION |
| 发现项偏少、会话缺失 | 角色缺pg_monitor | 用管理角色GRANT pg_monitor TO <role>;;pgbot 在连接时会直接告诉你缺哪条 GRANT |
| deltas 缺失 | 统计被重置 / 服务器重启 / scale-to-zero | Neon 冷窗口属预期行为;pgbot 会抑制而非误报 |
| Neon 连接报 channel_binding 相关错误 | 驱动不支持通道绑定 | 无需处理——新版 pgbot 自动忽略该参数 |
| Docker 本机连接卡 ~10s | localhost先解析到 IPv6 | 用127.0.0.1(托管平台不受影响) |
私有网络一步接入:--ssh-tunnel
VPC 里的 RDS、堡垒机后面的 Postgres,用--ssh-tunnel一步到位:
pgbot inspect "postgres://pgbot_ro@db.internal:5432/appdb?sslmode=verify-full" \ --ssh-tunnel bastion.example.com # 或 user@host:port,或 ~/.ssh/config 别名--ssh-tunnel是全局参数,所有会建连的命令都认它;$PGBOT_SSH_TUNNEL环境变量可为整个会话设置(internal/conn/sshtunnel.go)。- 它不是
ssh -L端口转发,而是驱动层的 DialFunc:DSN 里保留真实主机名,sslmode=verify-full依然对真实主机名校验证书,.pgpass照常匹配,本机不开放任何端口。 - 跳板机如何连上(User、Port、IdentityFile、StrictHostKeyChecking…)全部读你现有的
ssh_config,裸别名直接可用,主机密钥的验证方式和你的ssh完全一致;链路慢就调大--timeout。
可选:让 AI 读懂报告 🤖
export OPENAI_API_KEY=sk-… # 或 GEMINI / ANTHROPIC / XAI 任一密钥 pgbot ask "why is it slow?"注意分工:发现项永远由 Go 代码确定性计算,模型只负责解释与排序,并且被要求把每一条 caveat 带进建议(比如"复制处于活动状态,先别删这个零扫描索引")。所有确定性命令(inspect、indexes、queries…)不需要任何密钥,数据不出本机。
收尾:验证你的配置 ✅
pgbot init "$DATABASE_URL" # 生成只读角色 SQL(含平台专属 pg_stat_statements 步骤),只打印不执行 pgbot init --verify "$DATABASE_URL" # 连上后核验角色权限是否齐备init会先探测你的平台,再生成量身定制的 SQL——Neon/Supabase 只需一条CREATE EXTENSION,RDS 则给出参数组 + 重启的完整步骤(实现见 cmd/pgbot/init.go)。
各平台的完整能力矩阵(谁能授pg_monitor、统计能否跨闲置存活、连接池默认端口……)详见 docs/providers.md;每条发现项都有离线可读的说明页,pgbot explain-finding <id>即可查阅(目录在 docs/findings/)。
一句话总结:pgbot 连不上托管库,多半不是工具的问题,而是"从哪连、用什么角色、统计怎么开"这三件事——本文的速查表和分平台步骤,把它们逐一变成了确定动作。
【免费下载链接】pgbot
Postgres intelligence for ai agents
相关推荐
终极指南:如何用Zappa优化RDS与Aurora数据库连接性能
终极指南:如何用Zappa优化RDS与Aurora数据库连接性能 Zappa是一个基于Python的服务部署和管理工具,支持多种云服务和部署选项。它提供简单易用
云原生DevOps后端DotNetNext/SqlSugar数据库连接池故障诊断
DotNetNext/SqlSugar数据库连接池故障诊断 引言 数据库连接池是现代应用开发中的关键组件,它通过复用数据库连接来提升性能并减少资源消耗。在使用D
数据库ORM后端3分钟定位数据库连接问题:DBeaver故障诊断完全指南
3分钟定位数据库连接问题:DBeaver故障诊断完全指南 你是否还在为数据库连接失败而反复检查密码?是否遇到过"连接超时"却找不到原因的情况?本文将通过DBea
数据库客户端桌面应用数据库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考