PostgreSQL - 用户“postgres”的对等身份验证失败

Posted

技术标签:

【中文标题】PostgreSQL - 用户“postgres”的对等身份验证失败【英文标题】:PostgreSQL - Peer authentication failed for user "postgres" 【发布时间】:2020-11-30 07:05:55 【问题描述】:

我有一个在我的 Windows 机器上运行的机器人,我最近购买了一个 Ubuntu 虚拟服务器。在一系列类似的无限错误之后,我只是完全重置服务器并从头开始重试。您可以在这里查看我以前的一些错误的另一篇文章:no pg_hba.conf entry for host / Connect call failed / Invalid data directory for cluster 12 main - Postgresql Ubuntu

所以现在当我尝试启动我的机器人时,它给了我这个错误:

Traceback (most recent call last):
  File "bot.py", line 950, in <module>
    bot.loop.run_until_complete(create_db_pool())
  File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "bot.py", line 160, in create_db_pool
    bot.pg_con = await asyncpg.create_pool(database='xxx', user='postgres', password='???')
  File "/usr/local/lib/python3.8/dist-packages/asyncpg/pool.py", line 398, in _async__init__
    await self._initialize()
  File "/usr/local/lib/python3.8/dist-packages/asyncpg/pool.py", line 426, in _initialize
    await first_ch.connect()
  File "/usr/local/lib/python3.8/dist-packages/asyncpg/pool.py", line 125, in connect
    self._con = await self._pool._get_new_connection()
  File "/usr/local/lib/python3.8/dist-packages/asyncpg/pool.py", line 468, in _get_new_connection
    con = await connection.connect(
  File "/usr/local/lib/python3.8/dist-packages/asyncpg/connection.py", line 1718, in connect
    return await connect_utils._connect(
  File "/usr/local/lib/python3.8/dist-packages/asyncpg/connect_utils.py", line 663, in _connect
    con = await _connect_addr(
  File "/usr/local/lib/python3.8/dist-packages/asyncpg/connect_utils.py", line 642, in _connect_addr
    await asyncio.wait_for(connected, timeout=timeout)
  File "/usr/lib/python3.8/asyncio/tasks.py", line 483, in wait_for
    return fut.result()
asyncpg.exceptions.InvalidAuthorizationSpecificationError: Peer authentication failed for user "postgres"

但是数据库、用户和密码都是正确的。它现在仍在工作,因为该机器人正在我的 Windows 机器上运行,这就是为什么我认为这是一个 Ubuntu 特定问题。我的收听地址设置为“

listen_addresses = '*'

本地 Windows 服务器上的 pg_hba.conf:

# TYPE  DATABASE        USER            ADDRESS            METHOD

# IPv4 local connections:
host    all             all             0.0.0.0/0            md5
# IPv6 local connections:
host    all             all             ::0/                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all             0.0.0.0/0            md5
host    replication     all             ::0/                 md5

我在 Ubuntu 服务器上的 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            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

如果我将第一行从 peer 更改为 md5,我会得到:

asyncpg.exceptions.InvalidPasswordError: password authentication failed for user "postgres"

更改为trust 表示没有数据库xxx,这是我本地Windows 机器上的数据库。 输入ps ax | grep postgres 显示:

   9929 ?        Ss     0:02 /usr/lib/postgresql/12/bin/postgres -D /var/lib/pos           tgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf
   9931 ?        Ss     0:00 postgres: 12/main: checkpointer
   9932 ?        Ss     0:01 postgres: 12/main: background writer
   9933 ?        Ss     0:01 postgres: 12/main: walwriter
   9934 ?        Ss     0:01 postgres: 12/main: autovacuum launcher
   9935 ?        Ss     0:01 postgres: 12/main: stats collector
   9936 ?        Ss     0:00 postgres: 12/main: logical replication launcher
  21821 pts/0    S+     0:00 grep --color=auto postgres

我已经坚持了很长时间,我不知道该怎么办。我真的希望有人知道这个问题,我希望我已经提供了足够的信息。谢谢。

我认为它试图连接到 Ubuntu 服务器上的数据库,而不是我的 Windows 机器上的数据库。如何使它以 Windows 机器为目标?

【问题讨论】:

这需要更多信息。在 Windows 机器、Ubuntu VM 或两者上运行的 Postgres 在哪里? Ubuntu VM 是否在 Windows 机器上运行,如果不在哪里? Postgres 在我的 Windows 机器上,Ubuntu VM 来自 Vultr.com,但我正在使用 PuTTy 连接到它 那么抛出​​上述错误的程序在哪里运行? Postgres 是否也安装在 Ubuntu VM 上并正在运行? 具有您显示的 pg_hba 文件的数据库不会抛出该错误消息。要获取该消息,您的 pg_hba 必须指定“ident”或“peer”作为方法。因此,您必须拥有多个 pg_hba 文件,并且没有使用您认为的那个。另一方面,至少你的服务器现在正在运行。 Postgres 安装在 unbuntu 上,我相信它正在运行。 bot.py/root/bot/bot.py 我刚刚也输入了 sudo find / -type f -name pg_hba.conf 并得到了 2 个结果:/var/lib/postgresql/12/main/pg_hba.conf /etc/postgresql/12/main/pg_hba.conf 其中一个实际上是不同的,所以我认为这最终是错误的。但是我将它们都更改为上面的 conf (并且还删除了一个,然后删除了另一个,然后将两者都放回去)并且它仍然给出相同的错误。我不知道发生了什么。 【参考方案1】:

client.pg_con = await asyncpg.create_pool(database=database, user=user, password=password, host="127.0.0.1")

同时添加 host="127.0.0.1",这解决了我的问题。

【讨论】:

以上是关于PostgreSQL - 用户“postgres”的对等身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章

org.postgresql.util.PSQLException:致命:从 Spring Boot 连接到 postgres 时用户“postgres”的密码验证失败

PostgreSQL - 用户“postgres”的对等身份验证失败

postgresql用户管理

postgres安装

postgres密码修改

Postgresql 使用不同于 postgres 的用户导入转储