PostgreSQL:为什么 psql 无法连接到服务器?

我输入了 psql 并得到了这个:

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"?

我使用 sudo netstat -nlp | grep 5432 查看状态,但没有显示。我在网上搜索,有人告诉我修改 pg_hba.conf ,但我不能 locate 这个文件。我也试过这个命令 sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432 。它行不通。

stack overflow PostgreSQL: Why psql can't connect to server?
原文答案
author avatar

接受的答案

该错误表明 psql 实用程序找不到连接到数据库服务器的套接字。要么您没有在后台运行数据库服务,要么套接字位于其他位置,或者可能需要修复 pg_hba.conf

步骤 1:验证数据库是否正在运行

该命令可能因您的操作系统而异。但在大多数 *ix 系统上,以下方法可以工作,它将在所有正在运行的进程中搜索 postgres

ps -ef | grep postgres

在我的系统 mac osx 上,这吐出

501   408     1   0  2Jul15 ??         0:21.63 /usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres -r /usr/local/var/postgres/server.log

最后一列显示用于启动服务器的命令和选项。

您可以使用以下命令查看所有可用于启动 postgres 服务器的选项。

man postgres

从那里,您会看到选项 -D-r 分别是 datadirlogfilename

步骤 2:如果 postgres 服务正在运行

使用 find 搜索套接字的位置,该位置应该在 /tmp 中的某个位置

sudo find /tmp/ -name .s.PGSQL.5432

如果 postgres 正在运行并接受套接字连接,上面应该告诉你套接字的位置。在我的机器上,结果是:

/tmp/.s.PGSQL.5432

然后,尝试通过 psql 显式使用此文件的位置进行连接,例如。

psql -h /tmp/ dbname

第 3 步:如果服务正在运行但您没有看到套接字

如果找不到套接字,但看到服务正在运行,请验证 pg_hba.conf 文件是否允许本地套接字。

浏览到 datadir ,您应该会找到 pg_hba.conf 文件。

默认情况下,您应该在文件底部附近看到以下行:

# "local" is for Unix domain socket connections only
local       all       all       trust

如果看不到,可以修改文件,重启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

在您的情况下,状态很可能会下降。如果不重启 PostgreSQL 服务

第 2 步:重新启动 pg_ctlcluster

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

#restart PostgreSQL service
sudo service postgresql restart

第 3 步:第 2 步失败并抛出错误

如果重新启动 pg_lsclusters 不成功,则会抛出错误。我的错误是(您可以在日志 /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 用户组


它发生在我身上,结果我错误地从“ssl-cert”组中删除了 Postgres 用户。运行以下代码来修复用户组问题并修复权限

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

# Fixed 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 postgresql restart
作者头像

我遇到过几次类似的问题。通常我只是在这个 tutorial 之后重新安装 PostgreSQL,这以丢失数据为代价解决了问题。

我决心今天得到真正的修复。重新启动 PostgreSQL 在 ubuntu 上解决了它。 sudo /etc/init.d/postgresql restart

作者头像

我在 Ubuntu 18.04 上使用 PostgreSQL 时遇到了这个问题。

我检查了我的 PostgreSQL 状态并意识到它运行良好,使用:

sudo systemctl status postgresql

我还尝试使用以下方法在机器上重新启动 PotgreSQL 服务器:

sudo systemctl restart postgresql

但问题仍然存在:

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"?

跟随 Noushad' answer 我做了以下事情

列出您设备上运行的所有 Postgres 集群:

pg_lsclusters

这给了我这个红色的输出,表明它们都关闭了,状态也显示 down

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 down   postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
11  main    5433 down   postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
12  main    5434 down   postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

为其中一个服务器集群重新启动 pg_ctlcluster。对我来说,我重新启动了 PG 10

sudo pg_ctlcluster 10 main start

然而它抛出了下面的错误,当我尝试重新启动其他 PG 集群时发生了同样的错误:

Job for postgresql@10-main.service failed because the service did not take the steps required by its unit configuration.
See "systemctl status postgresql@10-main.service" and "journalctl -xe" for details.

检查日志是否有错误,在本例中我的是 PG 10

sudo nano /var/log/postgresql/postgresql-10-main.log

我看到以下错误:

2020-09-29 02:27:06.445 WAT [25041] FATAL:  data directory "/var/lib/postgresql/10/main" has group or world access
2020-09-29 02:27:06.445 WAT [25041] DETAIL:  Permissions should be u=rwx (0700).
pg_ctl: could not start server
Examine the log output.

这是因为我更改了 PostgreSQL 数据目录的文件权限。

我通过运行下面的命令修复了它。我在我的机器上运行了 3 个 PG 集群的命令:

sudo chmod -R 0700 /var/lib/postgresql/10/main
sudo chmod -R 0700 /var/lib/postgresql/11/main
sudo chmod -R 0700 /var/lib/postgresql/12/main

之后我重新启动了每个 PG 集群:

sudo pg_ctlcluster 10 main start
sudo pg_ctlcluster 11 main start
sudo pg_ctlcluster 12 main start

最后我再次检查了集群的健康状况:

pg_lsclusters

这一次一切都很好,因为状态显示在线

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 online postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
11  main    5433 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
12  main    5434 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

就这样。

我希望这有帮助

作者头像

在我的例子中,以下内容在遇到错误后用于启动 postgres

sudo service postgresql start
sudo su - postgres
psql
作者头像

解决了!虽然我不知道发生了什么,但我只是删除了所有的东西并重新安装了它。这是我用来删除它的命令 sudo apt-get --purge remove postgresql*dpkg -l | grep postgres 。后一种是在不干净的情况下查找所有数据包。

作者头像

我面临同样的问题

sudo su - postgres
initdb --locale en_US.UTF-8 -D /var/lib/postgres/data
exit
sudo systemctl start postgresql
sudo systemctl status postgresql

这对我有用。

作者头像

如果您使用的是 WSL 2,请使用:

sudo service postgresql start
作者头像

在 debian 上快速如何从 psql 客户端远程访问服务器上的 postgres 数据库:(更改的配置在文件中记录):

1.用listen_address编辑 /etc/postgresql/10/main/postgresql.conf *

  1. 编辑 /etc/postgresql/10/main/pg_hba.conf 并在末尾添加行 host all all 0/0 md5

  2. 创建登录角色 postgres=# CREATE ROLE remoteuser LOGIN WITH PASSWORD 'foo'

  3. sudo /etc/init.d/postgresql restart 更改生效

  4. 使用 psql --host=ipofserver --port=5432 --username=remoteuser --password --dbname=mydb 从客户端登录

  5. 交互式询问密码,在这种情况下是 foo

作者头像

我通过检查我的文件系统解决了这个问题,磁盘已满,因此数据库无法启动

Unix 域套接字 "/var/run/postgresql/.s.PGSQL.5432" ? 上的连接

我尝试了一系列故障排除,直到我检查我的磁盘使用情况并发现它已满,100% 使用情况,

df -h
cd /var/log/odoo/
cat /dev/null > odoo-server.log
reboot

相关问题