33

我正在使用 PostgreSQL,并且我有一个用户,其密码与 database.yml 中指定的密码匹配

postgres=# select * from pg_user
;
  usename   | usesysid | usecreatedb | usesuper | usecatupd | userepl |  passwd  | valuntil | useconfig 
------------+----------+-------------+----------+-----------+---------+----------+----------+-----------
 goodsounds |    16386 | t           | t        | t         | t       | ******** |          | 
 postgres   |       10 | t           | t        | t         | t       | ******** |          | 
(2 rows)

但是当我尝试通过运行命令创建数据库时

rails db:create

我得到错误

致命:用户“goodsounds”的对等身份验证失败

这是我的 pg_hba.conf:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust

以前上面的“信任”是md5,但我改变了看看是否有帮助。

这是我的database.yml:

# PostgreSQL. Versions 8.2 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On Mac OS X with macports:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
  adapter: postgresql
  encoding: unicode
  database: goodsounds_development
  pool: 5
  username: goodsounds
  password: test

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  host: localhost
  port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # The server defaults to notice.
  #min_messages: warning

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: postgresql
  encoding: unicode
  database: goodsounds_test
  pool: 5
  username: goodsounds
  password: test

production:
  adapter: postgresql
  encoding: unicode
  database: goodsounds_production
  pool: 5
  username: goodsounds
  password: test
4

5 回答 5

97

“对等身份验证”意味着它使用 unix 套接字并期望连接的 unix 用户具有与 postgresql 用户名相同的 unix 用户名。

由于您的本地 unix 用户名是funkdified并且您正尝试以用户身份通过​​您指定身份验证goodsounds的 unix 域套接字 ( ) 连接进行连接,因此 Pg 正确地拒绝了您的连接尝试。localpg_hba.confpeer

这是使用 unix 套接字时许多安装的默认行为。

你可以:

  • 通过在数据库连接设置中指定主机名来通过 TCP/IP 连接;
  • 编辑pg_hba.conf以使用md5密码身份验证而不是peerunix 套接字(local连接类型)的身份验证,因此 Pg 接受密码身份验证;或者
  • 使用与您的 unix 用户名相同的 PostgreSQL 用户名进行连接,如果该用户尚不存在,则在 PostgreSQL 中创建该用户。

请参阅文档以及文档的pg_hba.conf客户端身份验证章节的其余部分。

请注意,更改pg_hba.conf不会立即生效,您必须重新启动或至少重新加载 PostgreSQL 以使其重新读取pg_hba.conf


哦,另外,如果你安装了多个 PostgreSQL 版本,你可能有一个版本的 libpq 和另一个版本的服务器。在这种情况下,请确保 libpq 默认连接到的 unix 套接字的位置与服务器的位置相同,或者在连接字符串中unix_socket_directories使用(例如)覆盖它 。host=/tmp

于 2013-03-09T07:48:36.790 回答
20

我在 Ubuntu 机器上遇到了同样的问题,所以我按照一些步骤删除了这个错误。切换到 postgres 用户

$ sudo su - postgres

它会要求输入密码,默认密码是postgres

将用户切换到 postgres 后,打开 psql 控制台

$ psql

如果有多个版本可用,请检查 postgres 的版本

psql=# select VERSION();

PostgreSQL 9.1.13 on x86_64-unk....         # so version is 9.1

现在打开postgres user

vim /etc/postgresql/9.1/main/pg_hba.conf

9.1是版本返回形式上层命令

并更换

local   all             postgres                                peer

local   all             postgres                                md5

重启服务

sudo service postgresql restart

我也在我的博客上写了步骤

http://tarungarg402.blogspot.in/2014/10/set-up-postgresql-on-ubuntu.html

于 2015-01-29T13:16:57.217 回答
11

如果“对等身份验证”不起作用,请尝试 md5 authenticationaion。

要指定主机尝试这样的事情:

 psql -d <dbname> -U <username> -h <hostname>

或这个:

 psql -d <dbname> -U <username> -h <hostname> -W
于 2014-04-17T19:56:32.597 回答
4

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

# "local" is for Unix domain socket connections only
    local   all             all                                     peer

更改为下一行,它对我有用

# "local" is for Unix domain socket connections only
local   all             all                                     md5
于 2016-08-14T06:52:46.690 回答
0

这是我解决它的方法

运行以下命令以确认您的 PostgreSQL 版本。

psql --version

导航到服务器上的PostgreSQL配置目录,该目录位于/etc/postgresql/10/main. 请注意,这10是我在服务器上安装的PostgreSQL版本。您的版本可能是9.51112任何其他版本。

cd ~
cd /etc/postgresql/10/main

导航到目录后,使用以下命令/etc/postgresql/10/main打开文件。pg_hba.conf该文件控制:允许连接哪些主机,如何验证客户端,可以使用哪些 PostgreSQL 用户名,可以访问哪些数据库:

sudo nano pg_hba.conf

替换以下行:

# Database administrative login by Unix domain socket
local       all       postgres       peer

与下面的行:

# Database administrative login by Unix domain socket
local       all       postgres       md5

另外,替换下面的行:

# "local" is for Unix domain socket connections only
local       all       all            peer

与下面的行:

# "local" is for Unix domain socket connections only
local       all       all            md5

此外,我们可能希望在生产环境中允许到 PostgreSQL 数据库的入站连接(允许使用 md5 方法从所有数据库、所有用户、所有地址进行主机连接)。

为此,请在文件末尾添加以下行,然后保存文件:

# remote connections
host      all      all      all      md5

仍在目录中,使用以下命令/etc/postgresql/10/main打开并编辑文件:postgresql.conf

sudo nano postgresql.conf

用下面的行替换行# listen_address='127.0.0.1'或行listen_address='127.0.0.1'或行# listen_address='localhost'或行listen_address='localhost',以允许 PostgreSQL 数据库侦听来自所有地址的连接:

listen_addresses = '*'

保存文件,然后导航到服务器的根目录:

cd ~

使用以下命令重新启动或重新加载 PostgreSQL 服务器:

sudo systemctl restart postgresql       # To restart
sudo systemctl reload postgresql        # To reload
于 2019-11-01T20:22:16.417 回答