我尝试使用主机变量
PGPASSWORD
和.pgpass
,这两个都不允许我对数据库进行身份验证。我拥有 chmod
'd .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"
快速解决方案
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
有时你可以使用
sudo -u postgres pg_dump ...
几周前为了工作弄清楚后,我不得不再次查找这个(但现在尝试在家里设置一个 postgresql 数据库),但你可能想修改你的
pg_hba.conf
文件。
我所做的是注释掉默认的“本地”规范,因为它使用
peer
方法对所有本地用户进行身份验证。 数据库管理员的这篇文章有助于阐明这一点。
最后,您的
pg_hba.conf
文件应如下所示:
# "local" is for Unix domain socket connections only
#local all all peer
local <db_name> <user> password
然后,如果您想使用 cron 计划备份或重新启动服务后需要做的事情是:
PGPASSWORD=$(cat /home/<user>/.pg-pass) pg_dump -Fc -U <pg_user> -d <db_name> > /home/<user>/<db_name>.dump
转储文件的输出位置无关紧要,因此我暂时将其放在我的主文件夹中,但为了工作,我在脚本中设置了相同样式的代码设置,该脚本创建每日备份,然后
rclone
到云。