PostgreSQL Field Guide

PostgreSQL 连接错误排查

按 DNS、网络、TLS、认证、database 和连接数顺序诊断常见连接失败

连接失败发生在 SQL 执行之前时,客户端不一定能得到 SQLSTATE。保留完整错误文本、时间、客户端版本和目标 host/port,但不要记录密码。

固定诊断顺序

DNS 解析
 → TCP 路由/防火墙/监听端口
 → TLS 协商与证书身份
 → pg_hba.conf 匹配
 → 用户认证
 → database 与 CONNECT 权限
 → 连接数/池容量
 → 会话初始化参数

跳过前一层直接重置密码或放宽权限,通常会掩盖真实问题。

高频错误

错误含义验证
could not translate host nameDNS/主机名无法解析getent hostsnslookup,核对拼写和私网 DNS
connection refused目标地址没有接受该端口服务状态、listen_addresses、端口和容器映射
connection timed out网络路径或防火墙丢弃从同一应用环境测试 TCP,不从个人电脑代替
no pg_hba.conf entry没有匹配来源/database/user/TLS 的 HBA 规则查看服务端日志和规则顺序;修改后 reload
password authentication failed凭据或认证方式不匹配,常见 SQLSTATE 28P01确认目标实例和 user,安全轮换密码
database ... does not exist目标实例中没有该 database,SQLSTATE 3D000连接 postgres 后查询 pg_database
too many connections实例/角色/数据库连接上限耗尽,SQLSTATE 53300pg_stat_activity、连接池与保留管理连接
certificate verify failedCA、主机名、有效期或证书链错误检查 sslmode、URI host、CA 和平台轮换通知

客户端验证

psql --version
psql -X "postgresql://app_reader@db.example.com:5432/commerce?sslmode=verify-full"

连接成功后立即运行:

\conninfo
SELECT current_database(), current_user,
       inet_server_addr(), inet_server_port(),
       current_setting('server_version');

服务端最小检查

SELECT datname, datallowconn, datconnlimit
FROM pg_database
ORDER BY datname;

SELECT usename, application_name, client_addr, state, count(*)
FROM pg_stat_activity
GROUP BY usename, application_name, client_addr, state
ORDER BY count(*) DESC;

需要操作系统权限时再检查监听 socket、防火墙和 PostgreSQL 日志。云数据库没有主机权限,应使用平台连接诊断、网络流日志和审计日志。

不要用 trust 验证密码问题

pg_hba.conf 改为 trust 会移除认证边界,并且不能证明原密码为何失败。应在受控渠道轮换凭据,核对匹配到的 HBA 规则和服务端日志。

成功连接的安全配置见 psql 与 SSL;SQL 执行错误见 SQLSTATE 速查

Last updated on

On this page