连接远程数据库时出现错误:"psql: could not connect to server: Connection refused"。

115
我正在尝试使用以下命令连接到安装在远程服务器上的Postgres数据库: psql -h host_ip -U db_username -d db_name 发生以下错误: psql: could not connect to server: Connection refused Is the server running on host "<host_ip>" and accepting TCP/IP connections on port 5432?
以下是需要注意的几点:
1. Postgres安装版本为9.4。 2. 主机操作系统:Ubuntu 15.04。 3. 客户端操作系统:Centos 7。
我已经尝试了以下方法,但问题仍未解决:
1. 编辑pg_hba.conf文件以包括:
host all all 0.0.0.0/0 md5
2. 编辑'postgresql.conf'并将监听参数更改为: listen_addresses='*'
  1. 重新启动了Postgres服务。
  2. 在主机和客户端上禁用了防火墙和iptables。
  3. 我通过在本地运行psql命令进行了检查,它可以正常工作。
  4. 我尝试了此question中给出的第二个解决方案。运行nmap命令后,我得到了以下输出:

Starting Nmap 6.47 ( http://nmap.org ) at 2015-09-07 18:08 IST Nmap scan report for 10.17.250.250 Host is up (0.0000040s latency). Not shown: 997 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http

我有什么遗漏吗?希望有人能帮忙。


防火墙仍然阻止端口5432的访问。请检查您的iptables配置。 - Dmitry S
@Dmitry 我通过运行 sudo ufw disable 禁用了 iptables,但我仍然收到相同的错误。 - Poonam Anthony
你可以尝试执行命令 'netstat -na | grep 5432',看看PostgreSQL是否绑定到所有接口? - kometen
只有这个语句,才能让我避免花费大量时间来托管所有0.0.0.0/0 md5。 - ShivarajRH
20个回答

194
cd /etc/postgresql/9.x/main/

打开名为 postgresql.conf 的文件

sudo vi postgresql.conf

将此行添加到该文件中

listen_addresses = '*'

然后打开名为pg_hba.conf的文件

sudo vi pg_hba.conf

并将此行添加到该文件中

host  all  all 0.0.0.0/0 md5

它允许所有用户使用加密密码访问所有数据库

重新启动您的服务器

sudo /etc/init.d/postgresql restart

11
你好,UBUNTU 16 LTS和pg9.5不兼容... 你是否有适合此环境和权限的完整的pg_hba.confpostgresql.conf脚本?我需要使用PGPASSWORD=postgres psql -U postgres - Peter Krauss
@PeterKrauss 我遇到了这个问题。在UBUNTU 16 LTS上与pg9.5不兼容。你有解决方法吗? - Arpit
抱歉@Arpit,那是在2017年的事情了...今天最好的解决方案(接近2020年)就是将UBUNTU升级到18 LTS版本并升级PostgreSQL到v11+。 - Peter Krauss
1
感谢上帝,你这个美丽的人类。 - jason m
只是完成第一步就对我有用了 - Ubuntu,Django - Josh
显示剩余2条评论

35

检查 postgresql.conf 中定义的端口。我的 Postgres 9.4 安装使用的是 5433 端口,而不是 5432 端口。


1
只是想补充一下,这也发生在我的Postgres 11的postgresql.conf上...从来没有注意过postgresql.conf,但将其修复为5432就足够了。 - Carl H
我也遇到了这个问题,Postgres 12。 - Andre
很奇怪,我在安装程序菜单中选择了5432,但实际上出现的是5433。因此,这影响的是新版本而不是旧版本。 - Alkanshel

11

我曾在尝试远程连接我树莓派上的新PostgreSQL安装时遇到了问题。以下是我解决这个问题所做的全部步骤:

首先,打开PostgreSQL配置文件并确保该服务将会在本地主机之外进行监听。

sudo [editor] /etc/postgresql/[version]/main/postgresql.conf

我使用了nano,但你可以使用任何你选择的编辑器,而且我安装的是版本9.1,那个目录将适用于你安装的任何版本。

向下滚动到标题为“连接和身份验证”的部分。第一个设置应该是'listen_addresses',并且可能看起来像这样:

#listen_addresses = 'localhost'     # what IP address(es) to listen on;

右侧的注释提供了更改此字段的良好指示,并且对于所有建议使用'*'将有效。

请注意,此字段已被#注释掉。 根据注释,它将默认为“localhost”,因此仅更改值为'*'是不够的,您还需要通过删除前导的#来取消注释设置。

现在应该像这样:

listen_addresses = '*'         # what IP address(es) to listen on;

您还可以检查下一个设置项'port',以确保您正确连接。5432是默认端口,如果未指定端口,psql将尝试连接到该端口。

保存并关闭文件,然后打开Client Authentication配置文件,该文件位于同一目录中:

sudo [editor] /etc/postgresql/[version]/main/pg_hba.conf

如果您想限制访问,我建议阅读该文件,但对于基本的开放连接,您可以跳转到文件底部并添加以下一行:

host all all all md5

如果您愿意,可以按Tab键而不是空格键来将字段与现有列对齐。

个人而言,我会添加一个看起来像这样的行:

host [database_name] pi 192.168.1.0/24 md5

这将限制连接仅限于本地区域网络子网上的一个用户和一个数据库。

一旦您保存了对文件的更改,您需要重新启动服务以实施更改。

sudo service postgresql restart

现在,您可以使用以下命令检查服务是否在正确的端口上公开侦听:

sudo netstat -ltpn
如果您不以管理员身份运行它(使用sudo),它将不会告诉您监听这些端口的进程名称。
其中一个进程应该是Postgres,本地地址应该是开放的(0.0.0.0)而不仅仅是限制于本地流量(127.0.0.1)。如果它没有开放,则需要重新检查配置文件并重新启动服务。您可以再次确认服务正在侦听正确的端口(默认为5432,但您的配置可能不同)。
最后,您将能够成功地通过以下命令从远程计算机连接:
psql -h [server ip address] -p [port number, optional if 5432] -U [postgres user name] [database name]

8

确保配置文件中的设置已正确应用。

vim /etc/postgresql/x.x/main/postgresql.conf

请尝试以下方法查看日志并找到问题。
tail /var/log/postgresql/postgresql-x.x-main.log

1
感谢@amirio,这是找到确切问题的正确方法。 在我的情况下,与文件权限有关的问题。 2019-05-20 19:53:45.406 IST [4843] FATAL: 数据目录"/var/lib/postgresql/9.5/main"具有组或全局访问权限 2019-05-20 19:53:45.406 IST [4843] DETAIL: 权限应为u=rwx(0700)。 - Aniket Singh
非常感谢您的帮助。在检查了我的日志之后,我发现我需要将(0700)赋予我的/var/lib/10/main目录,这对我很有效。 - paule mandengue

8

在进行配置后,您需要进行以下设置:

要打开端口5432,请编辑/etc/postgresql/9.1/main/postgresql.conf并更改

# Connection Settings -

listen_addresses = '*'          # what IP address(es) to listen on;

/etc/postgresql/10/main/pg_hba.conf 中

# IPv4 local connections:
host    all             all             0.0.0.0/0           md5

现在重新启动您的DBMS

sudo service postgresql restart

现在,您可以连接到

psql -h hostname(IP) -p port -U username -d database

【在 AWS EC2 上】我还需要编辑入站端口,以接受 5432 端口的流量。 - Franco Gil

7

步骤 1:编辑文件 postgresql.conf

  • 文件位置应为:etc/postgresql/10/main/

  • 找到:

    #连接设置 -

    #listen_addresses = '' # 要监听的 IP 地址;

  • 去掉监听地址前面的 #

  • 添加 '*' :

    listen_addresses = '*'


步骤 2:编辑文件 pg_hba.conf

  • 文件位置应为:etc/postgresql/10/main/

  • 在末尾添加以下给定行

    host all all 0.0.0.0/0 md5


步骤 3:重启 postgres 服务器

sudo /etc/init.d/postgresql restart

步骤 4:检查 Postgres 服务器状态

sudo netstat -plunt |grep postgres
  • 确保您使用相同的端口访问数据库

3

如果你使用的是Mac,那么翻译很简单,请尝试以下步骤:

brew install postgres

这将告诉您是否已经安装,并且安装的版本是什么,如果没有安装,则会为您安装最新版本,然后运行。

brew upgrade postgresql

这将确保您安装的是最新版本,最后请执行以下操作:
brew services start postgresql

这将重新启动服务。希望这能对某些人有所帮助。


2
在我的情况下,我删除了一个本地设置并生成了另一个本地设置。由于postgresql.conf文件中的致命错误,在“lc_messages”、“lc_monetary”、“lc_numberic”和“lc_time”上导致数据库无法打开。
恢复本地设置解决了我的问题。

谢谢你,我的朋友。对我来说也是这样的情况。 - undefined

1
在postgresql.conf中查看端口并更改端口。我的Postgres 9.4安装使用的是5431或5434端口,而不是5432端口。 如果提示端口正在使用,请更改端口。 并检查是否在psql安装过程中提供了密码,如果是,请在文件中提供密码并保存。

1
在我的情况下,我没有在管理门户中更改Azure的默认安全策略。原始设置是允许端口22,其余都被拒绝。只要我添加了5432端口,一切都变得很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接