Ubuntu下psql -U postgres报Peer认证失败的原因及修复方案
问题原因
你遇到的报错是PostgreSQL的Peer认证规则触发导致的,核心逻辑如下:
- 你的
pg_hba.conf第一行配置了本地Unix套接字连接postgres用户时,使用peer认证方式,且PostgreSQL会按配置行的从上到下顺序匹配规则,匹配到第一条符合条件的规则后就不再往下匹配,所以你本地无参数连接postgres用户时永远命中这条peer规则,不会走下面的md5规则。 peer认证要求当前登录的Linux系统用户名,和你请求连接的PostgreSQL用户名完全一致才能通过校验:你用普通系统用户执行psql -U postgres时,系统用户名和PG的postgres用户不匹配,因此认证失败;执行sudo -u postgres psql时切换到了postgres系统用户,身份匹配因此能正常连接。
排查方法
- 确认
pg_hba.conf的实际路径,避免修改错配置文件,执行命令:sudo -u postgres psql -c 'show hba_file;' - 验证规则匹配逻辑:不加
-h参数的psql命令默认走Unix域套接字,命中local类型规则;加-h 127.0.0.1参数的命令走TCP连接,命中host类型规则。
修复方案
你可以根据使用场景选任意一种方案:
- 方案1:不修改配置,继续使用
sudo -u postgres psql方式连接,这是默认最安全的管理方式,不需要额外改动。 - 方案2:修改
pg_hba.conf规则,允许用密码本地连接postgres用户:- 把第一行的
local all postgres peer改为local all postgres md5 - 重载PostgreSQL配置让改动生效:
sudo systemctl reload postgresql - 如果你还没给
postgres用户设置数据库密码,先执行sudo -u postgres psql进入数据库,执行ALTER USER postgres PASSWORD '你设置的密码';设置密码,之后就能用psql -U postgres输入密码登录。
- 把第一行的
- 方案3:临时用密码登录不需要改配置,指定走TCP连接即可:
执行psql -U postgres -h 127.0.0.1,输入postgres用户的数据库密码就能正常登录。
内容的提问来源于stack exchange,提问作者JimmyTheCode
相关产品推荐
相关产品推荐

