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

hid*_*ame 37 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"?
Run Code Online (Sandbox Code Playgroud)

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

小智 48

就我而言,以下内容适用于在遇到错误后启动 postgres

sudo service postgresql start
sudo su - postgres
psql
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用 (6认同)

Hal*_*Ali 31

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

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

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

ps -ef | grep postgres
Run Code Online (Sandbox Code Playgroud)

在我的系统上,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
Run Code Online (Sandbox Code Playgroud)

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

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

man postgres
Run Code Online (Sandbox Code Playgroud)

从那里,你会看到选项-D,-r分别是datadir&logfilename.

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

使用find搜索插座的位置,这应该是在某处/tmp

sudo find /tmp/ -name .s.PGSQL.5432
Run Code Online (Sandbox Code Playgroud)

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

/tmp/.s.PGSQL.5432
Run Code Online (Sandbox Code Playgroud)

然后,尝试使用此文件的位置通过psql连接,例如.

psql -h /tmp/ dbname
Run Code Online (Sandbox Code Playgroud)

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

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

浏览到datadir,你应该找到该pg_hba.conf文件.

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

# "local" is for Unix domain socket connections only
local       all       all       trust
Run Code Online (Sandbox Code Playgroud)

如果您没有看到它,则可以修改该文件,然后重新启动postgres服务.

  • 第一步在 wsl2 上的 Ubuntu20.04 上给我 `user 3251 2963 0 17:31 pts/4 00:00:00 grep --color=auto postgres` (postgres 为红色)。这是什么意思? (4认同)
  • 重启postgres的命令:/sf/answers/3682734051/ (3认同)
  • 我担心这可能不适用于我的情况.我在任何地方都没有pg_hba.conf,但仍然有一个本地功能的postgresql服务器.使用这个答案,并咨询https://www.postgresql.org/docs/9.4/static/auth-pg-hba-conf.html以获得更多远程访问选项.谢谢@Haleemur Ali! (2认同)
  • 我遵循了所有这些说明,因为在我尝试“sudo -u postgres psql”后,我的服务显示了相同的消息。由于我是 Linux 和命令行的初学者,因此在使用了很多“man”之后,我终于发现可以简单地运行“find /var/run/ |”。grep postgres` 进程就会显示出来,对吗?我发现这个: `/var/run/postgresql/.s.PGSQL.5433` 它位于 5433!`sudo -u postgres -p 5433` 和 BOOM - 你已经准备好再次出发了:) (2认同)

KNT*_*NTY 20

有多种潜在因素可能导致 psql 无法在 WSL 2 Ubuntu 环境中与 PostgreSQL 服务器建立连接。

要检查 Postgresql 是否正在运行,请使用此命令

sudo service postgresql status
Run Code Online (Sandbox Code Playgroud)

如果它没有运行,您可以使用以下命令启动它

sudo service postgresql start
Run Code Online (Sandbox Code Playgroud)

如果您在 Postgresql 配置中进行了更改以应用更改

sudo service postgresql restart
Run Code Online (Sandbox Code Playgroud)


Nou*_*had 12

如果启动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
Run Code Online (Sandbox Code Playgroud)

最有可能的情况是你的情况下和postgres服务

第2步:重新启动pg_ctlcluster

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

#restart postgres
sudo service postgres restart
Run Code Online (Sandbox Code Playgroud)

第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`
Run Code Online (Sandbox Code Playgroud)

第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 postgres restart
Run Code Online (Sandbox Code Playgroud)


Aas*_*thi 11

我面临同样的问题

sudo su - postgres
initdb --locale en_US.UTF-8 -D /var/lib/postgres/data
exit
sudo systemctl start postgresql
sudo systemctl status postgresql
Run Code Online (Sandbox Code Playgroud)

这对我有用。


小智 10

我曾经遇到过类似的问题.通常我只是按照本教程完成 PostgreSQL的全新安装,并以丢失数据为代价解决问题.

我决心今天得到真正的解决方案.重启PostgreSQL在ubuntu上解决了它.sudo /etc/init.d/postgresql restart


Pro*_*ton 7

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

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

sudo systemctl status postgresql
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl restart postgresql
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在:

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"?
Run Code Online (Sandbox Code Playgroud)

Noushad 的回答之后,我做了以下事情

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

pg_lsclusters
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

sudo pg_ctlcluster 10 main start
Run Code Online (Sandbox Code Playgroud)

然而,它抛出了下面的错误,当我尝试重新启动其他 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.
Run Code Online (Sandbox Code Playgroud)

检查日志是否有错误,在这种情况下,我的是PG 10

sudo nano /var/log/postgresql/postgresql-10-main.log
Run Code Online (Sandbox Code Playgroud)

我看到以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

这是因为我更改了 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
Run Code Online (Sandbox Code Playgroud)

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

sudo pg_ctlcluster 10 main start
sudo pg_ctlcluster 11 main start
sudo pg_ctlcluster 12 main start
Run Code Online (Sandbox Code Playgroud)

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

pg_lsclusters
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

就这样。

我希望这有帮助

  • 非常感谢,这行 `/var/log/postgresql/postgresql-10-main.log` 救了我。人们可以在`/var/lib/postgres/13/main/log/`下找到很多关于日志文件的信息,但是经过3天的研究,我没有找到任何关于主日志文件的信息,现在我在主日志文件中看到了记录我的 `server.crt` ee 密钥太小。只是创建新的 2048 位的“crt”对我来说很有效 (2认同)

hid*_*ame 5

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

  • 给其他读者注意:这至少会删除您的配置,因此不要盲目地运行此命令。在大多数情况下,存在某些特定的错误,例如服务器根本没有启动,您应该解决特定的问题,而不是清除并重新安装所有内容。 (14认同)

qrt*_*tLs 5

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

  1. /etc/postgresql/10/main/postgresql.conf使用listen_address进行编辑*
  2. 编辑/etc/postgresql/10/main/pg_hba.conf并在最后添加行host all all 0/0 md5
  3. 创建登录角色postgres=# CREATE ROLE remoteuser LOGIN WITH PASSWORD 'foo'
  4. sudo /etc/init.d/postgresql restart更改生效

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

  6. 以交互方式询问密码,在本例中是 foo


小智 5

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

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

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

df -h
cd /var/log/odoo/
cat /dev/null > odoo-server.log
reboot
Run Code Online (Sandbox Code Playgroud)