FATAL: password authentication failed 90%源于pg_hba.conf规则未匹配或顺序错误:需确认host行覆盖客户端IP、认证方法(md5/scram-sha-256)与用户密码加密方式一致,且执行reload生效,而非重启服务。

FATAL: password authentication failed for user xxx 这类拒绝访问,90% 不是密码输错了,而是 pg_hba.conf 里没配对规则,或者配了但顺序不对、匹配条件太严。
检查 pg_hba.conf 的匹配规则是否生效
PostgreSQL 不看用户名和密码对不对,它先查 pg_hba.conf —— 找不到匹配项,直接拒绝,连密码都不验。
- 打开
pg_hba.conf(通常在 PostgreSQL 数据目录下,比如/var/lib/pgsql/14/data/pg_hba.conf或C:\Program Files\PostgreSQL\14\data\pg_hba.conf) - 确认有类似这样的行,且位置靠前(规则按顺序匹配,第一条命中就停止):
host all all 192.168.1.0/24 md5
- 如果你是从本机用 Navicat 连(比如 Windows 上连本地 WSL 或 Docker 里的 PG),别只配
local行,host行也要覆盖127.0.0.1/32或::1/128 - 改完必须 reload(
pg_ctl reload或SELECT pg_reload_conf();),不是重启服务也能生效
确认连接方式与 pg_hba.conf 条目类型一致
Navicat 默认走 TCP/IP,哪怕你填的是 localhost,它也大概率发 IPv4 连接请求,而不是 Unix socket。这意味着 local 规则完全不生效。
-
local只管 Unix socket(Linux/macOS)或 named pipe(Windows),对 Navicat 无效 -
host管 IPv4,hostssl管加密 IPv4,hostnossl管非加密 IPv4 —— 你得对应上 - 如果 Navicat 填的是
127.0.0.1,规则里 CIDR 必须是127.0.0.1/32;填的是localhost,DNS 解析后还是127.0.0.1,所以一样 - 某些旧版 Windows 安装包默认把
listen_addresses设为localhost,但pg_hba.conf却只写了127.0.0.1/32,看着一样,其实 hostname 解析可能走 IPv6,导致不匹配
验证用户密码是否被正确设置为 md5/scram-sha-256
就算 pg_hba.conf 允许 md5,如果用户密码是用 ALTER USER ... PASSWORD 'xxx' 设置的,而服务器配置要求 scram-sha-256(PostgreSQL 14 默认启用 scram),那照样拒绝。
- 登录 psql,执行:
SELECT rolname, rolpassword FROM pg_authid WHERE rolname = 'your_user';
如果rolpassword字段以md5开头,说明存的是 md5 hash;如果是SCRAM-SHA-256$开头,才是 scram 格式 - 检查
postgresql.conf中的password_encryption值:scram-sha-256是 14+ 默认,md5是兼容旧客户端的降级选项 - 若需兼容 Navicat 旧版本(如 15.x),可临时设为
md5,然后重设密码:ALTER USER your_user PASSWORD 'xxx';
- 注意:改
password_encryption后,新设的密码才按该方式加密;已有密码不会自动转换
Navicat 15.x 连 PostgreSQL 14 报错 datlastsysoid 的干扰项
这个错误实际表现为连接成功但点不开数据库(报 ERROR: column "datlastsysoid" does not exist),不是 FATAL 拒绝访问。但它常被误认为“连不上”,尤其在升级 PG 14 后首次打开 Navicat 时。
- 这是 Navicat 15.0.29–16.1 的硬编码 SQL 问题,和认证无关,不影响连接建立
- 只要 Navicat 显示“连接测试成功”,就说明
pg_hba.conf和密码都没问题,只是后续元数据查询崩了 - 解决方式只有三个:升级到 Navicat 16.2+、手动 patch
libcc.dll(替换datlastsysoid→dattablespace)、或换 DBeaver/psql 临时替代 - 别把它和真正的
FATAL: password authentication failed混为一谈——前者能连上,后者连都连不上
真正卡在 FATAL 阶段的,几乎全是 pg_hba.conf 规则没覆盖到,或者规则写了但没 reload。很多人改完 conf 就去 Navicat 点测试,忘了 reload 这一步,然后反复怀疑密码、网络、防火墙,其实日志里早写了 “no pg_hba.conf entry found”。











