这是 PostgreSQL 最常见的本地连接错误之一,尤其在新安装后的 CentOS、Ubuntu、Debian 等系统上特别容易遇到。本文将为您详细解析错误原因并提供快速解决方案。
一、错误原因(最常见的情况)
PostgreSQL 默认在本地连接(通过 Unix Socket)时使用 peer 认证方式:
- peer 认证规则:操作系统用户名必须和 PostgreSQL 用户名完全相同,才允许免密登录。
- 大多数人当前登录的系统用户是
root、centos、ubuntu等,而要登录的数据库用户通常是postgres(默认超级用户)。 - 结论:由于系统用户与数据库用户不匹配,导致 peer 认证失败并报错。
二、快速解决方案(推荐方式)
将本地连接的认证方式从 peer 改成 md5(密码认证),这样就可以通过密码登录了。
步骤(以主流 Linux 系统为例)
1. 找到 pg_hba.conf 文件位置
# Ubuntu/Debian
sudo find /etc/postgresql/ -name pg_hba.conf
# CentOS/RHEL/Rocky/AlmaLinux
sudo find /var/lib/pgsql/ -name pg_hba.conf
# 常见路径示例
/etc/postgresql/16/main/pg_hba.conf
/var/lib/pgsql/16/data/pg_hba.conf
2. 修改配置文件
用编辑器打开文件(需 root/sudo 权限),找到以下几行并修改:
# 建议改成(最常用、最方便)
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
更安全一点的写法(只给 postgres 用户开密码,其它保持 peer):
local all postgres md5
local all all peer
3. 重新加载配置
# 方式1:优雅重载(推荐)
sudo systemctl reload postgresql
# 方式2:暴力重启
sudo systemctl restart postgresql
4. 设置密码并测试
如果还没设置过密码,先进入 psql 设置:
sudo -u postgres psql
# 执行:
ALTER USER postgres WITH PASSWORD '你的新密码';
\q
最后测试连接:
psql -U postgres -h 127.0.0.1 -W
三、常用认证方式对比
| 写法 | 含义 | 推荐场景 | 安全性 |
|---|---|---|---|
peer |
系统用户 = 数据库用户 | su – postgres 登录 | ★★★★ |
md5 |
密码认证(最常用) | 开发/测试/生产 | ★★★ |
scram-sha-256 |
更安全的密码存储 (PG10+) | 正式生产环境 | ★★★★★ |
trust |
任何人免密登录 | 临时调试(危险!) | ☠☠☠ |
2025-2026 推荐做法:
local all postgres scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
发表回复