PostgreSQL 14 连接报错 FATAL password auth failed 怎么解决

文章导读
PostgreSQL 14 连接报错 FATAL password authentication failed 通常由密码错误、pg_hba.conf 认证方法不匹配或用户不存在导致。优先核对客户端加密算法与服务端配置是否一致,修改配置文件后必须重载服务才能生效。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

PostgreSQL 14 连接报错 FATAL password authentication failed 通常由密码错误、pg_hba.conf 认证方法不匹配或用户不存在导致。优先核对客户端加密算法与服务端配置是否一致,修改配置文件后必须重载服务才能生效。

先说结论:该报错表明服务端拒绝了客户端提供的凭据,核心在于身份认证环节配置不一致或凭据错误。

  • 先确认:检查 pg_hba.conf 中对应 IP 和用户的认证方法(md5 或 scram-sha-256)。
  • 先处理:确保客户端驱动支持服务端配置的加密算法,或重置用户密码。
  • 再验证:使用 psql 命令重新连接并查看服务端日志确认无新报错。

命令速用版

# 尝试连接并查看详细错误
psql -U 用户名 -d 数据库名 -h 主机地址

# 重载配置文件使更改生效(需 postgres 权限)
pg_ctl reload -D /var/lib/pgsql/14/data

# 或在 SQL 内部执行
SELECT pg_reload_conf();

为什么会这样

PostgreSQL 14 默认使用 scram-sha-256 加密存储密码,而旧版客户端或配置可能仅支持 md5。pg_hba.conf 文件控制了客户端连接的认证策略,若该行配置的方法与客户端能力或用户密码哈希格式不匹配,服务端会直接拒绝连接并记录 FATAL 错误。

分步处理

步骤 1:查看服务端日志定位具体用户和 IP
日志通常位于 /var/log/postgresql/ 或数据目录的 log 子文件夹。查找包含 FATAL 的行,确认报错的用户名和来源 IP。

步骤 2:检查 pg_hba.conf 配置
打开 pg_hba.conf 文件,找到对应 IP 段和数据库的记录。确认 METHOD 列是 md5 还是 scram-sha-256。若客户端较旧,可临时改为 md5 测试,但建议升级客户端。

PostgreSQL 14 连接报错 FATAL password auth failed 怎么解决

步骤 3:重置用户密码
若能通过本地 socket 登录,执行 ALTER USER 用户名 WITH PASSWORD '新密码';。确保新密码符合复杂度要求。

步骤 4:重载配置
修改 pg_hba.conf 后不会自动生效,必须执行 pg_ctl reload 或 SELECT pg_reload_conf()。

怎么验证是否生效

使用之前的连接命令再次尝试连接。若成功进入 psql 提示符,说明认证通过。同时观察服务端日志,确认不再新增 FATAL password authentication failed 记录。

PostgreSQL 14 连接报错 FATAL password auth failed 怎么解决

常见坑

1. 修改配置后未重载服务,导致配置未生效。
2. pg_hba.conf 文件有多行匹配规则,PostgreSQL 按顺序匹配,第一条匹配的规则生效,后续规则被忽略。
3. 用户名大小写敏感,创建时加了引号的用户名登录时必须加引号。

常见问题

用户确实存在为什么还报错?

可能 pg_hba.conf 限制了该用户的来源 IP,或者密码哈希格式与认证方法不兼容。

修改 pg_hba.conf 需要重启数据库吗?

不需要重启,执行重载命令 pg_ctl reload 即可生效,重启会影响业务连续性。

如何查看当前用户的加密方式?

查询 pg_authid 系统表需要超级用户权限,通常直接查看 pg_hba.conf 配置更直接。

参考来源

  • PostgreSQL 14 Documentation - Client Authentication: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html
  • PostgreSQL 14 Documentation - Password Authentication: https://www.postgresql.org/docs/14/auth-password.html