我正在尝试使用以下命令连接到远程服务器中安装的postgres数据库:
psql -h host_ip
-U db_username
-d db_name
发生错误:
psql:无法连接到服务器:连接被拒绝 服务器是否在主机上运行""并接受 端口5432上的TCP / IP连接?
我已经尝试了以下但问题仍未解决:
pg_hba.conf
个文件以包含主持全部0.0.0.0/0 md5
的listen_addresses =' *'
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
我错过了什么。希望有人可以提供帮助。
答案 0 :(得分:71)
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
答案 1 :(得分:12)
检查postgresql.conf
中定义的端口。我安装的postgres 9.4使用端口5433
而不是5432
答案 2 :(得分:4)
在尝试远程连接到我的Raspberry Pi上的新PostgreSQL安装时,我一直在努力解决这个问题。以下是我为解决此问题所做的全部细分:
首先,打开PostgreSQL配置文件,确保该服务将在localhost之外侦听。
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;
您还可以检查下一个设置“端口”,以确保正确连接。 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]
答案 3 :(得分:3)
确保在配置文件中正确应用了设置。
vim /etc/postgresql/x.x/main/postgresql.conf
请尝试以下操作查看日志并找到问题。
tail /var/log/postgresql/postgresql-x.x-main.log
答案 4 :(得分:1)
以下配置,您需要设置:
要打开端口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
答案 5 :(得分:1)
另一种情况,postgresql.conf
和pg_hba.conf
文件不在 /etc/postgresql/9.1/main/
。因为 postgres 可以在您设置的任何位置启动。
例如,当您使用命令 pg_ctl -D /tmp/pgsql/ start
时,postgresql.conf
和 pg_hba.conf
将位于 /tmp/pgsql/
。
答案 6 :(得分:0)
我认为您使用的是机器名而不是主机的IP。
当我尝试使用机器名称时出现了同样的错误。因为,仅当客户端和主机位于同一网络且安装了相同的操作系统时才允许。
答案 7 :(得分:0)
就我而言,我没有更改管理门户中的azure默认安全策略。原来是允许端口22,其余都被拒绝。只要我添加5432端口,一切都会变好。
答案 8 :(得分:0)
以下内容在macos Mojave上为我提供了帮助:
var http = require("http");
http.createServer(function (request,response) {
response.writeHead(200,"Content-Type":"text/plain");
response.write("Hello World");
response.end();
}).listen(8888);
答案 9 :(得分:0)
我遇到了完全相同的问题,但配置文件正确。就我而言,问题出自我使用的Eduroam wifi:当我通过另一个wifi连接时,一切正常。看来Eduroam至少在我的大学里封锁了5432端口。
答案 10 :(得分:0)
如果您使用的是Mac,那么我的操作非常简单:
list
这将告诉您是否已经安装了该版本,如果没有,请运行什么版本或为您安装最新版本
brew install postgres
这将确保您先安装了最新版本
brew upgrade postgresql
这将再次启动服务。我希望这对某人有帮助。
答案 11 :(得分:0)
查看端口并在postgresql.conf中进行端口更改。我的postgres 9.4安装使用端口5431或5434而不是5432。 如果显示端口正在使用中,请更改端口。 并检查是否在psql安装中提供了密码,因此请在文件中提供密码并保存。
答案 12 :(得分:0)
就我而言,我删除了一个语言环境并生成了另一个语言环境。由于postgresql.conf文件中“ lc_messages”,“ lc_monetary”,“ lc_numberic”和“ lc_time”上的致命错误,数据库无法打开。
恢复语言环境会为我解决问题。
答案 13 :(得分:0)
尝试迁移数据库。例如,如果您正在使用Heroku和Django托管项目,请尝试使用heroku run python manage.py migrate
命令;错误应该消失。
答案 14 :(得分:0)
我遇到了这样的问题,我必须通过 ssh 连接到服务器,然后在 psql 控制台中运行查询,因此查询在脚本中,但是每次我遇到此错误时都找不到 psql,所以我所做的只是添加了 psql我们从 cat .bash_profile 获得的 bin 中的完整路径及其完成
PATH=$PATH:/usr/local/pgsql/bin:/usr/local/mysql/bin
所以我添加了整个 /usr/local/mysql/bin/psql 而不是 psql 用于远程执行。