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

时间:2015-07-27 05:31:42

标签: 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。它无法运作。

27 个答案:

答案 0 :(得分:23)

该错误指出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分别是datadir& logfilename

第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服务。

答案 1 :(得分:9)

如果启动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用户来自&#34; ssl-cert&#34;组。运行以下代码以修复用户组问题并修复权限

#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

答案 2 :(得分:8)

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:1)

在我的情况下,以下内容在遇到错误后用于启动 postgres

sudo service postgresql start
sudo su - postgres
psql

答案 5 :(得分:1)

我在Devuan ascii上也遇到了同样的问题(也许也是Debian?)。配置文件/etc/postgresql/9.6/main/postgresql.conf包含指令unix_socket_directories,该指令默认情况下指向/var/run/postgresql。将其更改为/tmp(大多数客户默认情况下使用的外观)已为我修复。

答案 6 :(得分:0)

我相信我在卸载 PostgreSQL 11 和 12 后陷入了这个问题,而已经在 Ubuntu 21 上安装了 13。我刚刚通过 sudo nano /etc/postgresql/13/main/postgresql.conf 解决了这个问题,并发现 port = 5433(不知道为什么)。所以我改变了port = 5432。然后问题解决了。

答案 7 :(得分:0)

如果您使用的是用于 linux 和 Ruby on Rails 的 windows 子系统,请使用此命令检查您的 postgres 正在哪个端口上运行 sudo nano /etc/postgresql/12/main/postgresql.conf 如果它在端口 5433 则转到 database.yml 文件并在其中添加端口:5433 然后运行命令 sudo service postgresql start 我已经像这样解决了我的问题

答案 8 :(得分:0)

在我的例子中,我遇到了这个错误,def do_POST(self): form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'] }) post_data = {} for field in form: if field != 'file': post_data[field] = form.getvalue(field) # print(post_data) try: fileitem = form['file'] if fileitem.filename: fn = os.path.basename(fileitem.filename) open('./tmp/' + fn, 'wb').write(fileitem.file.read()) data_files = {'file' : open('./tmp/' + fn, 'rb')} # print(data_files) r = requests.post(_POST_URL, data = post_data, files = data_files) except: r = requests.post(_POST_URL, data = post_data) res = r.text try: data_files = None os.remove('./tmp/' + fn) except: pass self._set_headers() self.wfile.write(res.encode('utf-8')) (注意,它正在寻找的文件中的一个数字,/var/run/postgresql/.s.PGSQL.5433)存在。尝试了本页顶部的说明,但没有任何效果。

原来在 .s.PGSQL.5432 中有一个 PostGreSQL 12 配置文件的旧目录,我删除了它,解决了这个问题。

答案 9 :(得分:0)

就我而言,我看到了此错误,而postgres却运行。

问题是安装无法创建所需的集群。

解决方案是创建文件夹/etc/postgres/{postgresql-version}/main

,然后使用以下命令创建集群:

pg_createcluster {postgresql-version} main

之后,只要重新启动postgresql服务,一切都应该正常工作。

答案 10 :(得分:0)

在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

这给了我红色的输出,表明它们全部没电了,状态也显示了下降

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

仅此而已。

我希望这会有所帮助

答案 11 :(得分:0)

就我而言,服务正在运行,但是群集已关闭,而psql无法启动。我的配置文件看上去很完美,但是它不断抛出配置错误,并且似乎忽略了我所做的更改。

事实证明,每当您使用ALTER SYSTEM SET ...语法时,PostgreSQL就会写入一个名为postgresql.auto.conf的文件。除了常规的postgresql.confpg_hba.conf文件之外,该文件还被读取。在我的Ubuntu(18.04)发行版中,它们位于不同的文件夹中(!):
-pg_hba.confpostgresql.conf都在/etc/postgresql/12/main
-自动生成的文件为/var/lib/postgresql/12/main/postgresql.auto.conf

我曾尝试使用ALTER SYSTEM SET listen_addresses = <my-ip>来更改配置,但是犯了一个错误,这造成了我找不到的损坏的“鬼”配置。一旦我删除了postgresql.auto.conf中的违规行,它就解决了所有问题。

答案 12 :(得分:0)

我可以通过为datadir设置正确的权限来解决此问题。 应该是

chmod 700 /var/lib/postgresql/10/main
chown postgres.postgres /var/lib/postgresql/10/main

答案 13 :(得分:0)

使用以下方法验证Postgres是否正在运行:

ps -ef | grep postgres
root@959dca34cc6d:/var/lib/edb# ps -ef|grep postgres
enterpr+    476  1  0 06:38 ?        00:00:00 /usr/lib/edb-as/11/bin/edb-postgres -D /var/lib/edb-as/11/main2 -c config_file=/etc/edb-as/11/main2/postgresql.conf

检查数据目录和postgresql.conf

在我的情况下,-D中的数据目录与postgresql.conf中的数据目录不同

所以我更改了postgresql.conf中的数据目录,并且它起作用了。

答案 14 :(得分:0)

如果您的服务不安全,则可能是原因

vi /etc/postgresql/11/main/pg_hba.conf

  1. 打开hba配置文件,该配置文件通常位于 etc 目录中。

host    all   all    localhost trust   md5

  1. 您可以删除 trust 关键字

  2. 保存pg_hba.conf

  3. sudo服务postgresql重新启动。

答案 15 :(得分:0)

重新启动实例对我有用。另外,如在其他一些文章中提到的,psql -h'/ tmp'在重启之前也可以正常工作。但是重启后psql直接开始工作。 因此,我想的可能是重启后重置的一些文件所有权问题。

答案 16 :(得分:0)

我有类似的问题,问题出在配置文件pg_hba.conf中。我之前进行了一些更改,这导致服务器在尝试启动时出错。注释掉多余的内容可以解决问题。

答案 17 :(得分:0)

我有同样的问题。 似乎没有集群时就没有套接字。

在安装过程中,默认的群集创建失败,因为未设置默认语言环境。

答案 18 :(得分:0)

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

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

连接

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

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

答案 19 :(得分:0)

我遇到了同样的问题,

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

这对我有用。

答案 20 :(得分:0)

该错误表示Postgres服务器未运行。尝试启动它:

sudo systemctl start postgresql

确保服务器在启动时启动:

sudo systemctl enable postgresql

答案 21 :(得分:0)

它可能导致任何事情,例如,我的问题是由于配置文件上的拼写错误引起的。 有人说是由证书文件引起的,还有一些人说是由不匹配的本地用户引起的。

如果找不到有关此问题的任何解决方案,请删除postgres并重新安装。这是最佳解决方案。

答案 22 :(得分:0)

在postgresql的全新安装过程中。默认情况下,用户名和密码被指定为&#34; postgres&#34;。此RDBMS提供的功能是为新用户添加角色并创建数据库。如果您遇到这样的错误:

  1. 以默认用户名登录:

    root @ kalilinux:〜#sudo -i -u postgres

  2. ype psql for interactive prompt

    postgres @ kalilinux:〜$ psql

  3. 退出提示使用

    \ q

  4. 创建新用户角色

    postgres @ kalilinux:〜$ createuser --interactive

  5. 现在您处于交互式psql shell中。请享用。不要忘记从您的用户名登录并键入psql for shell。

答案 23 :(得分:0)

所以对于我和我的伙伴们在Node.js应用程序上工作(使用Postgres和Sequelize),我们不得不

  1. brew services start postgresql(我们其中一人失踪了,我们其中一人没有,但我们得到的错误信息与上面列出的相同)

  2. createdb <name of database in config.json file> ****(利用Homebrew开始postgres)

  3. node_modules/.bin/sequelize db:migrate

  4. npm start

  5. extern const int data[]; extern const int DATA_SIZE; //other functions, not relevant int get_second_item(void);

答案 24 :(得分:0)

我对此错误消息的问题是对密钥和pem证书的错误权限,我已经操作过。对我帮助很大的是: /var/log/postgresql/postgresql-9.5-main.log所有错误都在哪里。

答案 25 :(得分:0)

关于debian的快速说明:

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

  7. 使用psql --host=ipofserver --port=5432 --username=remoteuser --password --dbname=mydb

  8. 从客户端登录
  9. 密码以交互方式询问,在这种情况下是foo
  10. 这是如何从psql客户端远程访问服务器上的postgres数据库

答案 26 :(得分:0)

只想添加一小段内容:如果您的实例在套接字上抱怨,您还可以检查unix_socket_directories文件/data/postgresql.conf,该文件可能已设置为/tmp,例如,如果您使用过第三方发行版。您可以将其更改为/var/run/postgresql并重新启动该服务。这可能还需要在postgresql创建/var/run目录,在subsys/postgresql-9.6创建/var/lock,如果这些目录尚不存在(使用postgresql 9.6为我工作)。