当我创建一个新用户,但它不能登录数据库。 我是这样做的:

postgres@Aspire:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

然后创建一个数据库:

postgres@Aspire:/home/XXX$ createdb -O dev test_development

之后,我尝试psql -U dev -W test_development登录,但得到错误:

psql: FATAL:  Peer authentication failed for user "dev"

我试图解决这个问题,但失败了。


当前回答

您的连接失败了,因为默认情况下psql使用对等身份验证通过UNIX套接字连接,这要求当前UNIX用户具有与psql相同的用户名。因此,您必须创建UNIX用户dev,然后以dev身份登录,或者使用sudo -u dev psql test_development访问数据库(psql不应该要求密码)。

如果您不能或不想创建UNIX用户,例如您只想连接到数据库进行临时查询,那么使用psql——host=localhost——dbname=test_development——username=dev强制建立套接字连接(正如@meyerson answer所指出的)将解决您的直接问题。

但是如果你打算在Unix套接字而不是peer方法上强制密码验证,请尝试更改下面的pg_hba.conf*行:

from

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

to

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5

peer表示它信任UNIX用户的身份(真实性)。所以不是问密码。 md5意味着它将始终要求密码,并在使用md5散列后验证它。

当然,您还可以为特定的数据库或用户创建更具体的规则,其中一些用户具有peer,而另一些用户需要密码。

修改pg_hba.conf后,如果PostgreSQL正在运行,您将需要通过重新加载(pg_ctl reload)或重新启动(sudo service PostgreSQL restart)使其重新读取配置。

* pg_hba.conf文件很可能在/etc/postgresql/9.x/main/pg_hba.conf

编辑:来自@Chloe, @ javereh, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What的评论纳入了回答。

其他回答

当你指定:

psql -U user

它通过UNIX Socket连接,默认情况下使用对等身份验证,除非在pg_hba.conf中另有指定。

您可以指定:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

在loopback接口上为指定的数据库和用户获取TCP/IP连接(包括IPv4和IPv6)。

更改后,您必须重新启动postgres或重新加载它的配置。 在现代基于RHEL/Debian的发行版中重新启动:

service postgresql restart

重新加载应该以以下方式工作:

pg_ctl reload

但是该命令可能会根据PATH配置而不同——你可能必须指定绝对路径,这可能会不同,这取决于postgres的安装方式。

然后你可以使用:

psql -h localhost -U user -d database

使用该用户通过TCP/IP登录到指定的数据库。 Md5代表加密密码,也可以在授权时为明文密码指定密码。只要数据库服务器只能在本地访问,没有网络访问,这两个选项就不应该有什么大问题。

重要提示: pg_hba.conf中的定义顺序很重要-规则是从上到下读取的,就像iptables一样,所以你可能想在规则上面添加建议的规则:

host    all             all             127.0.0.1/32            ident

虽然@flaviodesousa的答案可以工作,但它也强制所有用户(其他所有人)输入密码。

有时对其他人保持对等身份验证是有意义的,但对服务用户例外。在这种情况下,你会想要在pg_hba.conf中添加一行,看起来像这样:

local   all             some_batch_user                         md5

我建议你在注释标题行下面添加这一行:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

重启PostgreSQL需要使用

sudo service postgresql restart

如果你使用的是9.3,你的pg_hba.conf很可能是:

/etc/postgresql/9.3/main/pg_hba.conf

pg_dump -h localhost -U postgres -F c -b -v -F mydb。备份mydb

您的连接失败了,因为默认情况下psql使用对等身份验证通过UNIX套接字连接,这要求当前UNIX用户具有与psql相同的用户名。因此,您必须创建UNIX用户dev,然后以dev身份登录,或者使用sudo -u dev psql test_development访问数据库(psql不应该要求密码)。

如果您不能或不想创建UNIX用户,例如您只想连接到数据库进行临时查询,那么使用psql——host=localhost——dbname=test_development——username=dev强制建立套接字连接(正如@meyerson answer所指出的)将解决您的直接问题。

但是如果你打算在Unix套接字而不是peer方法上强制密码验证,请尝试更改下面的pg_hba.conf*行:

from

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

to

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5

peer表示它信任UNIX用户的身份(真实性)。所以不是问密码。 md5意味着它将始终要求密码,并在使用md5散列后验证它。

当然,您还可以为特定的数据库或用户创建更具体的规则,其中一些用户具有peer,而另一些用户需要密码。

修改pg_hba.conf后,如果PostgreSQL正在运行,您将需要通过重新加载(pg_ctl reload)或重新启动(sudo service PostgreSQL restart)使其重新读取配置。

* pg_hba.conf文件很可能在/etc/postgresql/9.x/main/pg_hba.conf

编辑:来自@Chloe, @ javereh, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What的评论纳入了回答。

Try:

psql -U user_name  -h 127.0.0.1 -d db_name

在哪里

-U为数据库用户名 -h是本地服务器的主机名/IP,从而避免Unix域套接字 -d是要连接的数据库名称

然后,Postgresql将其计算为“网络”连接,而不是Unix域套接字连接,因此不像你在pg_hba.conf中看到的那样,将其计算为“本地”连接:

local   all             all                                     peer