216

当我创建一个新用户时,它无法登录数据库。
我这样做:

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"

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

4

12 回答 12

349

尝试:

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
于 2014-10-03T17:39:12.033 回答
231

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

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

但是,如果您打算通过 Unix 套接字而不是 peer 方法强制密码验证,请尝试更改以下pg_hba.conf* 行:

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peer意味着它将信任 UNIX 用户的身份(真实性)。所以不要求输入密码。

  • md5意味着它将始终要求输入密码,并在使用MD5.

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

更改 PostgreSQL 是否正在运行后,您需要通过重新加载 ( ) 或重新启动 ( )pg_hba.conf使其重新读取配置。pg_ctl reloadsudo service postgresql restart

* 该文件pg_hba.conf很可能位于/etc/postgresql/9.x/main/pg_hba.conf

已编辑: @Chloe、@JavierEH、@Jonas Eicher、@fccoelho、@Joanis、@Uphill_What 的评论已纳入答案。

于 2014-02-19T18:56:59.430 回答
30

对等身份验证意味着 postgres 向操作系统询问您的登录名并将其用于身份验证。要在 postgres 上使用对等身份验证以用户“dev”登录,您还必须是操作系统上的用户“dev”。

您可以在Postgresql 文档中找到有关身份验证方法的详细信息。

提示:如果验证方法不再有效,请断开服务器与网络的连接,并为“localhost”使用方法“trust”(并在启用方法“trust”时仔细检查您的服务器是否无法通过网络访问)。

于 2013-07-03T09:10:06.140 回答
25

当您指定:

psql -U user

它通过 UNIX Socket 连接,默认情况下使用peer身份验证,除非pg_hba.conf另有说明。

您可以指定:

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

在指定的环回接口(IPv4 和 IPv6)上获取 TCP/IP 连接databaseuser.

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

service postgresql restart

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

pg_ctl reload

但命令可能因 PATH 配置而异 - 您可能必须指定绝对路径,这可能会有所不同,具体取决于 postgres 的安装方式。

然后你可以使用:

psql -h localhost -U user -d database

user使用指定database的 TCP/IP 登录。md5代表加密密码,而您也可以password在授权期间指定纯文本密码。只要数据库服务器只能在本地访问,而没有网络访问权限,这两个选项应该不是什么大问题。

重要说明:事务 中的定义顺序pg_hba.conf- 规则从上到下读取,如 iptables,因此您可能希望在规则上方添加建议的规则:

host    all             all             127.0.0.1/32            ident
于 2015-05-05T12:26:50.407 回答
24

虽然@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

于 2014-05-21T15:03:41.110 回答
12

当我遇到它时,这对我有用:

sudo -u username psql
于 2015-01-23T17:52:08.643 回答
9

我只需要添加-h localhost

于 2019-06-13T19:17:24.663 回答
8

最简单的解决方案:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;
于 2016-06-09T06:41:38.327 回答
2

就我而言,我使用的是不同的端口。默认值为 5432。我使用的是 5433。这对我有用:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
于 2017-02-21T06:20:30.000 回答
1

对于将来看到这个的人来说,postgres是在/usr/lib/postgresql/10/bin我的 Ubuntu 服务器上。

我将它添加到我的 .bashrc 文件中的 PATH 中,并在末尾添加了这一行

PATH=$PATH:/usr/lib/postgresql/10/bin

然后在命令行上

$> source ./.bashrc

我刷新了我的 bash 环境。现在我可以postgres -D /wherever从任何目录使用

于 2019-03-15T01:59:38.763 回答
1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb

于 2020-04-19T06:07:20.213 回答
0

在终端尝试:

>> psql -U role_name -d database -h hostname.<domain>.com -W
于 2020-02-06T23:41:42.600 回答