psql无法连接到IP和端口为5432的PostgreSQL服务器(postmaster)?

14

在回复之前请阅读,避免重复回答。我正在运行我的邮件服务器(postgres)。以下是'sudo netstat -anp|grep 5432'的输出:

tcp  0  0 127.0.0.1:5432    0.0.0.0:*     LISTEN      29606/postmaster       
unix  2      [ ACC ]     STREAM     LISTENING     1650581 29606/postmaster /var/run/postgresql/.s.PGSQL.5432
unix  2      [ ACC ]     STREAM     LISTENING     1650582 29606/postmaster    /tmp/.s.PGSQL.5432               

我能够使用本地主机连接

psql -h localhost (OR 127.0.0.1) -d <DB> -U user -W

但是,当我尝试使用TCP从其他主机连接时,通过指定

psql -h ip_add_postmaster -d <DB> -U user -W

它会抛出如下错误:

psql: could not connect to server: Connection refused Is the server running on host XXXXXX and accepting TCP/IP connections on port 5432?

这里出了什么问题?

pg_hba.conf

# 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   

在postgresql.conf文件中,

listen_addresses = 'localhost, 127.0.0.1, ip_add_postmaster'

Note: ip_add_postmaster is same as my Elastic IP and not public DNS. If this information
matters.

我在这里做错了什么?机器托管在亚马逊 EC2 上,并已打开端口 5432。


@nos - 是的,在客户端机器上,我有/etc/hosts条目。从客户端机器上,我能够正常执行ssh -A <ip_add_postmaster>。谢谢。 - NullException
@nos - 是的,我在postgresql.conf文件中使用了实际的IP地址。 - NullException
1
你在设置listen_addresses参数后是否重启了Postgres?根据netstat显示,它只设置为127.0.0.1。 - Daniel Vérité
5个回答

16

根据您的netstat输出,它正在监听着127.0.0.1:5432,也就是本地主机。这只能从本地主机连接 ;)

在配置中设置listen_addresses='*',然后它就能工作了。

[编辑] 其他需要检查的事项:

  • 亚马逊防火墙是否阻塞了什么?
  • iptables是否阻塞了什么?

但首先确保监听地址是正确的,您的netstat输出显示它不能像此时一样工作。


3
手册似乎说的是相反的内容: "该值采用逗号分隔的主机名和/或数字IP地址列表形式。" - Milen A. Radev
抱歉,你是对的。我做了一个快速的谷歌搜索,结果看错了文章。 - Wolph
这是一个AWS防火墙问题;在我的安全组中添加了PostgreSQL端口后,问题得到解决。如果您正在AWS上设置PostgreSQL,这是一个不错的教程:https://github.com/snowplow/snowplow/wiki/Setting-up-PostgreSQL - Will

4

我发现的另一个问题是,如果你安装了两个Postgres实例,第二个实例可能会选择非默认端口(在我的情况下,是5433而不是5432)。因此,检查postgresql.conf文件中的端口可能是个好主意。


2
这刚刚让我免去了一些烦恼。我遇到了完全相同的问题。 - Cheyne

4

listen_addresses='localhost, private_ip'解决了问题。我无法在弹性IP上启动postmaster服务器。一旦Postgres服务器在localhost和私有IP上启动,我就能够连接。


0

我也遇到了同样的问题。在调试时,发现与端口无关,而是由于Postgres文件夹中缺少一些目录。

在更新Mac OS(从10.13.1-> 10.13.13)时,目录/usr/local/var/postgres/中的一些文件夹被删除。解决方法是添加缺失的目录:

mkdir /usr/local/var/postgres/pg_tblspc
mkdir /usr/local/var/postgres/pg_twophase
mkdir /usr/local/var/postgres/pg_stat
mkdir /usr/local/var/postgres/pg_stat_tmp
mkdir /usr/local/var/postgres/pg_replslot
mkdir /usr/local/var/postgres/pg_snapshots
mkdir /usr/local/var/postgres/pg_logical/{snapshots,mappings}

0

我遇到了这个问题,尝试了在SO上找到的各种解决方法,后来意识到这与我的权限有关,想要添加一个对我有效的简单解决方案。

简单地说,如果你在Windows上运行psql服务器,最初只能使用默认的postgres超级用户进行登录、启动服务器等操作。

因此,首先尝试从命令行运行: psql -U postgres -h localhost -p 5432 并在提示符处输入密码。如果您已经成功登录并且服务器正在运行,则是权限问题。从这里开始,您可以为自己创建一个角色,该角色具有登录特权,可以访问您要运行的任何数据库。

如果错误仍然存在,请考虑像上面提到的那样检查postgresql.conf,确保默认IP设置为*或localhost,并将端口设置为5432或您想要的任何端口。


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