无法在端口5432上连接到Postgresql


82

我安装了包含PostgreSQL 8.4 的Bitnami Django堆栈

当我运行时psql -U postgres,出现以下错误:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

PG肯定正在运行,pg_hba.conf文件如下所示:

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

是什么赋予了?

pg正在运行的“证明”:

root@assaf-desktop:/home/assaf# ps axf | grep postgres
14338 ?        S      0:00 /opt/djangostack-1.3-0/postgresql/bin/postgres -D /opt/djangostack-1.3-0/postgresql/data -p 5432
14347 ?        Ss     0:00  \_ postgres: writer process                                                                        
14348 ?        Ss     0:00  \_ postgres: wal writer process                                                                    
14349 ?        Ss     0:00  \_ postgres: autovacuum launcher process                                                           
14350 ?        Ss     0:00  \_ postgres: stats collector process                                                               
15139 pts/1    S+     0:00              \_ grep --color=auto postgres
root@assaf-desktop:/home/assaf# netstat -nltp | grep 5432
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      14338/postgres  
tcp6       0      0 ::1:5432                :::*                    LISTEN      14338/postgres  
root@assaf-desktop:/home/assaf# 

我不知道您在问什么,您也从未提供过意见。这是100位用户遇到一般错误并报告了不同的内容。该网站的格式完全不对。
埃文·卡罗尔

Answers:


87

此问题来自安装postgres没有版本号的软件包。尽管postgres将被安装并且将是正确的版本,但是用于设置集群的脚本将无法正确运行。这是包装问题。

如果您对使用postgres脚本感到满意,则可以运行该脚本来创建该集群并开始postgres运行。但是,有一种更简单的方法。

首先清除旧的postgres安装。当前问题在于9.1,所以我假设这就是您安装的内容

sudo apt-get remove --purge postgresql-9.1

现在只需重新安装

sudo apt-get install postgresql-9.1

注意软件包名称和版本号。HTH。


3
这对postgres 9.3有所帮助。
sevenseacat 2014年

1
这应该是公认的答案,也适用于postgres 9.4 / ubuntu 14.10
Malte 2015年

1
这个答案对Postgres 9.4和9.3的混合帮助了我。凉。
ingo 2015年

2
适用于ubuntu 16.04和postgres 9.5,但必须首先清除每个与postgres相关的软件包。
Evert 2016年

2
这真是一个了不起的答案!在postgres方面也带来了可怕的用户体验
user1952500 '16

23

该错误消息引用的是Unix域套接字,因此您需要调整netstat调用以不排除它们。因此,不带选项尝试它-t

netstat -nlp | grep 5432

我猜想服务器实际上在侦听套接字,/tmp/.s.PGSQL.5432而不是/var/run/postgresql/.s.PGSQL.5432您的客户端尝试连接的套接字。在Debian或Ubuntu上使用手工编译的或第三方PostgreSQL软件包时,这是一个典型的问题,因为Unix域套接字目录的源默认值为,/tmp但Debian软件包将其更改为/var/run/postgresql

可能的解决方法:

  • 使用第三方程序包提供的客户端(请致电/opt/djangostack-1.3-0/postgresql/bin/psql)。可能会完全卸载Ubuntu提供的软件包(由于其他反向依赖性,可能会很困难)。
  • 修复第三方软件包的套接字目录,使其与Debian / Ubuntu兼容。
  • 用于-H localhost通过TCP / IP连接。
  • 使用-h /tmp或等效PGHOST设置指向正确的目录。
  • 不要使用第三方软件包。

19

这对我有用:

编辑:postgresql.conf

sudo nano /etc/postgresql/9.3/main/postgresql.conf

启用或添加:

listen_addresses = '*'

重新启动数据库引擎:

sudo service postgresql restart

另外,您可以检查文件 pg_hba.conf

sudo nano /etc/postgresql/9.3/main/pg_hba.conf

并添加您的网络或主机地址:

host    all             all             192.168.1.0/24          md5

listen_address ='*'达到目的。它仅在“ localhost”上侦听,而不在127.0.0.1上侦听。谢谢!
mwm 2015年

我的天哪...终于有事了-在我添加地址和未注释的listen_address之前,别的没什么用。
AntonB

加一!它为我工作。
Atul Makwana '16

1
这适用于ubuntu Windows bash。
ahmadalibaloch '18

我可以证实,它可以在Ubuntu服务器的bash命令在Windows 10
罗纳德

18

您可以psql -U postgres -h localhost用来强制通过TCP而不是UNIX域套接字进行连接。您的netstat输出显示PostgreSQL服务器正在侦听localhost的端口5432。

您可以通过使用不同的netstat来找出PostgrSQL服务器使用哪个本地UNIX套接字:

netstat -lp --protocol=unix | grep postgres

无论如何,PostgreSQL服务器侦听的接口都在中配置postgresql.conf


17

只需创建一个像这样的软链接:

ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

1
这对我有用,似乎是最简单的解决方案,而无需更改您的postgresql配置。尝试建立链接时,请确保您是超级用户。
brendan

2
ln:无法创建符号链接'/var/run/postgresql/.s.PGSQL.5432':文件存在
P_M

我已经在/ var / run /目录中创建了“ postgresql”文件夹。它不存在。
Ikrom

效果惊人,这背后的原因是什么?
Teoman shipahi

7

我这样做来使其工作:

dpkg-reconfigure locales

选择您喜欢的语言环境然后运行

pg_createcluster 9.5 main --start

(9.5是我的Postgresql版本)

/etc/init.d/postgresql start

然后就可以了!

sudo su - postgres
psql

抱歉,我认为命令已经清楚了。对我来说,我在重新安装postgresql时遇到了这个问题,我尝试按类型重新启动它,service postgresql restart 但它说我没有任何postgresql集群。然后我找到了这种方法来帮助我:)
mymusise

好了,经过三个小时的谷歌搜索,您终于解决了我的问题。dpkg-reconfigure locales非常重要。
Don Mums

5

我必须在Debian Squeeze上编译PostgreSQL 8.1,因为我正在使用基于OpenACS的Project Open,并且无法在最新版本的PostgreSQL上运行。

默认的编译配置将unix_socketin 放进去/tmp,但是依赖PostgreSQL的Project Open将无法工作,因为它会寻找unix_socketat /var/run/postgresql

有一个设置postgresql.conf可以设置插槽的位置。我的问题是,无论是我能为设置/tmppsql工作,但没有项目打开,或者我可以将其设置为/var/run/postgresqlpsql不工作,但项目的开放做了。

解决此问题的一种方法是根据Peter的建议,为设置套接字/var/run/postgresql,然后运行psql

psql -h /var/run/postgresql

这使用本地权限在本地运行。唯一的缺点是它比简单的“ psql”更多地键入内容。

有人提出的另一个建议是在两个位置之间创建符号链接。这也起作用,但是链接在重新启动后消失了。仅使用-h参数可能会更容易,但是,我在中的PostgreSQL脚本中创建了符号链接/etc/init.d。我将符号链接创建命令放在“开始”部分。当然,当我发出停止并启动或重新启动命令时,它将尝试重新创建现有的符号链接,但是除了警告消息之外,这可能没有任何危害。

就我而言,不是:

ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

我有

ln -s /var/run/postgresql/.s.PGSQL.5432 /tmp/.s.PGSQL.5432

并将unix_socket显式设置为/var/run/postgresql/.s.PGSQL.5432in postgresql.conf


3

解:

做这个

export LC_ALL="en_US.UTF-8"

和这个。(9.3是我当前的PostgreSQL版本。编写您的版本!)

sudo pg_createcluster 9.3 main --start

woooow,这是唯一解决我的问题的方法,谢谢。
user3687723 '16

3

如果您的Postgres服务已启动并且正在运行,没有任何错误,或者在启动Postgres服务时没有错误,但是仍然出现上述错误,请按照以下步骤操作

第1步:正在运行pg_lsclusters将列出您设备上运行的所有postgres集群

例如:

Ver Cluster Port Status Owner    Data directory               Log file
9.6 main    5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log

在您的情况和postgres服务中,状态很可能会下降

步骤2:重新启动pg_ctlcluster

#format is pg_ctlcluster <version> <cluster> <action>
sudo pg_ctlcluster 9.6 main start

#restart postgres
sudo service postgres restart

步骤3:步骤2失败并引发错误

如果此过程不成功,将引发错误。您可以看到错误登录/var/log/postgresql/postgresql-9.6-main.log

我的错误是:

FATAL: could not access private key file "/etc/ssl/private/ssl-cert-snakeoil.key": Permission denied
Try adding `postgres` user to the group `ssl-cert`

步骤4:检查Postgres的所有权

确保postgres是的所有者/var/lib/postgresql/version_no/main

如果没有,请运行

sudo chown postgres -R /var/lib/postgresql/9.6/main/

步骤5:检查postgres用户是否属于ssl-cert用户组

原来,我错误地将Postgres用户从该ssl-cert组中删除了。运行以下代码可修复用户组问题并修复权限

#set user to group back with
sudo gpasswd -a postgres ssl-cert

# Fix ownership and mode
sudo chown root:ssl-cert  /etc/ssl/private/ssl-cert-snakeoil.key
sudo chmod 740 /etc/ssl/private/ssl-cert-snakeoil.key

# now postgresql starts! (and install command doesn't fail anymore)
sudo service postgres restart

2

就我而言,这是我编辑时输入的错字引起的 /etc/postgresql/9.5/main/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

但是MD5必须是小写的md5

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

1
这是为我解决的问题的答案:)我之前将我的更改trustedtrust,而没有重新启动服务,直到第二天我已经忘记更改后,它才中断
Phlippie Bosman

2

我发现卸载Postgres听起来令人信服。这有助于解决我的问题:

  1. 启动postgres服务器:

    sudo systemctl start postgresql
    
  2. 确保服务器在启动时启动:

    sudo systemctl enable postgresql
    

详细信息可以在DigitalOcean网站上找到


2

我的postgres-9.5服务器无法解决此问题。经过3天的零进度,尝试在此站点和其他站点上进行的所有修补,我决定重新安装服务器,并损失5天的工作量。但是,我确实在新实例上复制了该问题。在您采取我所采取的灾难性方法之前,这可能会提供一些有关如何解决它的观点。

首先,禁用postgresql.conf中的所有日志记录设置。这是本节:

# ERROR REPORTING AND LOGGING

注释掉该部分中的所有内容。然后重新启动服务。

重新启动时,使用 /etc/init.d/postgresql startrestart 我发现重新启动时处于超级用户模式会有所帮助。我为此操作打开了一个x窗口。您可以使用建立超级用户模式sudo -i

使用以下简单命令验证是否可以访问服务器: psql -l -U postgres

如果那不能解决问题,请考虑以下问题:

在尝试找到解决方案时,我正在更改许多文件夹的所有权。我知道我可能会再尝试恢复这些文件夹的所有权和chmods 2天。如果您已经弄乱了这些文件夹的所有权,并且不想完全清除服务器,请开始跟踪所有受影响的文件夹的设置,以使其恢复到原始状态。您可能想要尝试在另一个系统上进行并行安装,并系统地检查所有文件夹的所有权和设置。繁琐,但您也许可以访问您的数据。

获得访问权限后,系统地更改文件# ERROR REPORTING AND LOGGING部分中的每个相关行postgresql.conf。重新启动并测试。我发现日志的默认文件夹导致失败。我特别评论了log_directory。然后,系统将日志放入的默认文件夹为/var/log/postgresql


1

可能是因为您更改了/var/lib/postgresql/9.3/main文件夹的权限而发生的。

尝试使用以下命令将其更改为700:

sudo chmod 700 main

1

自从我使用Flask以来,这与问题并不完全相关,但这是我遇到的确切错误,并且这是获得想法的最相关线索。

我的设置:适用于Linux的Windows子系统,带有makefile和dockerfile的Docker-compose,Flask,Postgresql(使用包含表的架构)

要连接到postgres,请设置连接字符串,如下所示:

from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql+psycopg2://<user>:<password>@<container_name_in_docker-compose.yml>/<database_name>"

注意:在该线程中使用任何方法都无法获取任何IP(例如localhost,127.0.0.1)。使用容器名称而不是localhost的想法来自这里:https : //github.com/docker-library/postgres/issues/297

设置您的架构:

from sqlalchemy import MetaData
db = SQLAlchemy(app, metadata=MetaData(schema="<schema_name>"))

设置会话时,请设置功能的搜索路径:

db.session.execute("SET search_path TO <schema_name>")

0

我有Peter Eisentraut描述的完全相同的问题。使用netstat -nlp | grep 5432命令,我可以看到服务器正在监听socket /tmp/.s.PGSQL.5432

要解决此问题,只需编辑postgresql.conf文件并更改以下几行:

listen_addresses = '*'
unix_socket_directories = '/var/run/postgresql'

现在运行service postgresql-9.4 restart(用您的版本替换9-4),远程连接现在应该可以正常工作了。

现在允许本地连接,只需创建指向/var/run/postgresql目录的符号链接。

ln -s /var/run/postgresql/.s.PGSQL.5432 /tmp/.s.PGSQL.5432

不要忘记确保您pg_hba.conf的配置也正确。




0

我遇到了同样的问题(在Ubuntu 15.10(wily)上)。sudo find / -name 'pg_hba.conf' -printsudo find / -name 'postgresql.conf' -print变成空的。在此之前,似乎已经安装了多个postgresql实例。

当您看到已安装或依赖性问题列表时,您可能会遇到类似问题

.../postgresql
.../postgresql-9.x 

等等。

在这种情况下,您必须将sudo apt-get autoremove每个包装一乘一。

然后按照这封信,您会没事的。特别是在密钥导入和添加到源列表FIRST方面

sudo apt-get update && sudo apt-get -y install python-software-properties && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

如果不明智地使用,请替换wily为您的版本,即替换为lsb_release -cs

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ wily-pgdg main" >> /etc/apt/sources.list.d/postgresql.list'
sudo apt-get update && sudo apt-get install postgresql-9.3 pgadmin3

然后,您应该会很好,并且能够连接和创建用户。

预期产量:

Creating new cluster 9.3/main ...
config /etc/postgresql/9.3/main
data   /var/lib/postgresql/9.3/main
locale en_US.UTF-8
socket /var/run/postgresql
port   5432

我的解决方案来源(学分)


0

在遇到相同问题的同时,我尝试了不同的操作:

我手动启动了postgresql守护程序:

FATAL:  could not create shared memory segment ...
   To reduce the request size (currently 57237504 bytes), reduce PostgreSQL's
   shared memory usage, perhaps by reducing shared_buffers or max_connections.

所以我所做的就是设置一个下限shared_buffersmax_connectionspostgresql.confrestart服务。

这解决了问题!

这是完整的错误日志:

$ sudo service postgresql start
 * Starting PostgreSQL 9.1 database server                                                                                                                                                               * The PostgreSQL server failed to start. Please check the log output:
2013-06-26 15:05:11 CEST FATAL:  could not create shared memory segment: Invalid argument
2013-06-26 15:05:11 CEST DETAIL:  Failed system call was shmget(key=5432001, size=57237504, 03600).
2013-06-26 15:05:11 CEST HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 57237504 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
    If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
    The PostgreSQL documentation contains more information about shared memory configuration.

0

经过多次精疲力尽的尝试,我发现了基于其他帖子的解决方案!

dpkg -l | grep postgres
apt-get --purge remove <package-founded-1> <package-founded-2>
whereis postgres
whereis postgresql
sudo rm -rf <paths-founded>
sudo userdel -f postgres

0

在运行内部创建postgresql目录,然后运行以下命令。

ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

0

只需添加/ tmp unix_socket_directories

postgresql.conf

unix_socket_directories = '/var/run/postgresql,/tmp'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.