更新系统后可通过.pgpass登录PostgreSQL但无法用pg_dump怎么办?
问题原因
- 连接认证规则差异:你执行的
psql -U brian -d example_db未指定主机参数,PostgreSQL默认通过Unix域套接字建立连接,Ubuntu默认配置下pg_hba.conf对本地套接字连接采用peer认证规则,只要操作系统用户名与数据库用户名一致即可免密登录,全程不会读取.pgpass文件。而你的pg_dump命令添加了-h localhost参数,走TCP/IP协议连接,匹配的是pg_hba.conf中host类的认证规则,必须校验密码才会读取.pgpass文件,两套连接走的是完全独立的认证逻辑。 .pgpass匹配规则不匹配:.pgpass的条目是严格按hostname:port:database:username:password顺序匹配的,需要确认你写入的条目主机字段是localhost、端口字段为5432,如果使用通配符要确认用的是*符号,任意字段不匹配都会导致读取密码失败。- 系统更新后配置被覆盖:Ubuntu更新PostgreSQL软件包时如果选择了覆盖原有配置,
pg_hba.conf中原先自定义的TCP连接认证规则会被重置为默认值,也会导致密码校验失败。
解决办法
- 方案1:修改
pg_dump命令,移除-h localhost -p 5432参数,直接使用pg_dump -U brian -d example_db > '/home/brian/.../example_db.bak',和psql一样走Unix域套接字连接,直接复用peer认证免密执行即可。 - 方案2:如果必须使用TCP连接,首先确认
.pgpass权限为600(执行chmod 600 ~/.pgpass保证只有当前用户可读),再核对.pgpass中localhost:5432:example_db:brian:你的数据库密码条目完全正确。 - 方案3:可以临时执行
PGPASSWORD=你的数据库密码 pg_dump -h localhost -p 5432 -U brian -d example_db > 备份文件路径验证密码正确性,如果执行成功即可确定是.pgpass的匹配或权限问题。
内容的提问来源于stack exchange,提问作者Brian Bjarke Jensen
相关产品推荐
相关产品推荐

