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 测试,但建议升级客户端。
步骤 3:重置用户密码
若能通过本地 socket 登录,执行 ALTER USER 用户名 WITH PASSWORD '新密码';。确保新密码符合复杂度要求。
步骤 4:重载配置
修改 pg_hba.conf 后不会自动生效,必须执行 pg_ctl reload 或 SELECT pg_reload_conf()。
怎么验证是否生效
使用之前的连接命令再次尝试连接。若成功进入 psql 提示符,说明认证通过。同时观察服务端日志,确认不再新增 FATAL password authentication 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