如何使pg_dump正确进行身份验证

125

我尝试使用主机变量PGPASSWORD.pgpass,但这两者都无法使我成功验证数据库。我已经将.pgpass的权限更改为适当的权限,并尝试了以下方法:

export PGPASSWORD=mypass and PGPASSWORD=mypass

密码确实包含一个\,但我将其用单引号括起来PGPASS='mypass\',它仍然无法进行身份验证。

我正在运行:

pg_dump dbname -U username -Fc

我仍然收到

pg_dump: [archiver (db)] connection to database "dbname" failed: FATAL:  Peer authentication failed for user "username"

3
那个错误信息中的“...Peer authentication...”部分意味着它根本没有使用密码认证 - Milen A. Radev
2个回答

250

解决方案

问题在于它试图根据您当前的用户名执行本地peer身份验证。如果您想使用密码,必须使用-h指定主机名。

pg_dump dbname -U username -h localhost -F c

解释

这是由于您的 pg_hba.conf 文件中以下内容引起的。

local   all             all                                     peer
host    all             all             127.0.0.1/32            md5

这里告诉Postgres要使用本地用户的peer身份验证,需要将postgres用户名与当前系统用户名匹配。第二行是指使用主机名连接,并允许您通过md5方法使用密码进行身份验证。 我喜欢的开发配置 注意: 这仅适用于单用户工作站。在生产或多用户机器上使用可能会导致严重的安全漏洞。
当针对本地postgres实例进行开发时,我喜欢将本地身份验证方式更改为trust。这将允许使用任何用户无需密码通过本地unix套接字连接到postgres。只需将上面的peer更改为trust并重新加载postgres即可。
# Don't require a password for local connections
local   all             all                                     trust

6
对于任何不确定自己的conf文件在哪里的人:使用sudo locate pg_hba.conf -- 必须使用sudo,因为postgres用户将是唯一能够访问该目录的用户(我想)。 - jcollum
你的命令对我有用,但我找不到它在哪里,也不知道文件的名称,我该如何找到那个文件? - Sobhan
如果我在Docker中配置我的Postgres,那么这个设置是否适用于来自我的本地主机的连接? - Jack Chi

18

有时候你可以使用

sudo -u postgres pg_dump ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接