PostgreSQL错误'无法连接到服务器:没有这样的文件或目录'

151

我和其他一些人一样,当我在我的项目中运行rake db:migrate甚至尝试大多数数据库任务时,都会出现这个错误,我的Ruby on Rails 3.2应用程序也是如此。

PGError(无法连接到服务器:没有此文件或目录。 服务器是否正在本地运行并接受"/ tmp / .s.PGSQL.5432" Unix域套接字上的连接?

很久以前,我使用Homebrew安装了PostgreSQL,最近尝试安装MongoDB后,我的PostgreSQL安装就再也没有正常工作过。 我正在运行OS X v10.6 Snow Leopard。

出了什么问题?我如何更好地理解如何在Mac上设置PostgreSQL?

到目前为止(我想)这告诉我PostgreSQL没有运行(?)。

ps -aef|grep postgres                                                                                                   (ruby-1.9.2-p320@jct-ana) (develop) ✗
  501 17604 11329   0   0:00.00 ttys001    0:00.00 grep postgres

这告诉我PostgreSQL正在运行吗?

✪ launchctl load -w /usr/local/Cellar/postgresql/9.1.4/homebrew.mxcl.postgresql.plist                                                        (ruby-1.9.2-p136) 
homebrew.mxcl.postgresql: Already loaded
我该如何修复这个问题?我有什么遗漏的吗?
PS: ~/Library/LaunchAgents 包含两个PostgreSQL .plist文件。不确定它是否相关。
org.postgresql.postgres.plist
homebrew.mxcl.postgresql.plist

我尝试了下面的命令并得到以下结果。

$ psql -p 5432 -h localhost

psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (fe80::1) and accepting
    TCP/IP connections on port 5432?

据我所知,这是因为OS X安装了自己的PostgreSQL版本,而Homebrew在不同的位置安装了另一个版本,而PostgreSQL命令正在查找/tmp/目录。你需要在Stack Overflow上进一步搜索,但基本上你需要创建PostgreSQL的符号链接,这样任何查找tmp路径的内容都可以找到真实路径。

这是我找到的一个链接,里面提供了更多尝试的方法,特别是按照上述方法创建符号链接:Mac OSX Lion Postgres does not accept connections on /tmp/.s.PGSQL.5432。我仍然希望有人能够给出一个关于在OS X上安装PostgreSQL的概念和为什么会这么困难的合理解释。

最新的见解可帮助故障排除:

$ which psql // This tells you which PostgreSQL you are using when you run $ psql. 

然后运行:

$ echo $PATH

需要注意的关键事项是:

确保要运行的PostgreSQL副本的路径条目在OS X系统的PostgreSQL路径之前。

这是一个核心要求,决定哪个PostgreSQL被运行,也是我听说导致大多数问题的原因。


你有没有找到这个问题的解决方案?我看你还没有标记一个。这些都对我没有帮助。 - Andras Gyomrey
这仍然是大多数人都无法理解的巫术和奇怪的化身。我刚刚在上面添加了[编辑2],其中包含一些更多的建议以及如何根据我的编辑注释创建符号链接的链接。最终符号链接对我有用,但我认为我也卸载并重新安装了postgres和homebrew,所以很难知道到底是什么起了作用。祝好运。如果您发现任何新的内容,请回报,因为这个问题已经有15,000次浏览,给很多人带来了痛苦! - Evolve
@AndrasGyomrey 刚从澳大利亚的RailsCamp15回来,人们说一个关键是要正确设置你的路径文件,我已在上面的Edit 3中进行了说明。 - Evolve
请记住,launchctl 报告某个程序已加载并不一定意味着它正在运行。您可以考虑使用 https://bigsql.com/ 作为替代方案;它适用于 Mac 并且具有良好的管理界面。 - Jim Nasby
23个回答

113

检查你的postgres目录中是否没有postmaster.pid文件,可能位于/usr/local/var/postgres/

删除该文件并启动服务器。

检查 - https://github.com/mperham/lunchy 是一个很好的launchctl包装器。


3
这对我很有效。我刚刚重新安装了Yosemite,并从Homebrew中加载了Postgres。第一次使用它时正常运行,但在重新启动之后出现了这个问题。那么,你能解释为什么这样做有效吗? - Dan Williams
3
对我来说有效,但对于新手,有人能解释一下为什么以及这样做的安全性吗? - Alexander Mills
@AlexanderMills 如果您在运行Postgres实例时删除了/usr/local/var/postgres/postmaster.pid,则会出现两个实例,这是不好的。不好的意思是非确定性数据库行为、竞争条件等。但是,如果您确定没有运行Postgres,则可以安全地删除。 - LinFelix

64

对我来说,这行得通。

rm /usr/local/var/postgres/postmaster.pid

在删除此文件之后,您可能还需要使用以下任一命令重新启动Postgres:

brew services restart postgresql
# or 
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

10
在我的情况下,删除pid后,我需要使用pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start重新启动PostgreSQL。 - Obromios
5
当使用Homebrew安装PostgreSQL时,我也不得不重新启动它。你可以通过以下命令来完成:brew services restart postgresql。请注意,此命令将重启所有正在运行的PostgreSQL服务。 - santuxus
3
在我的 Docker 环境中出现了“没有此文件或目录”的情况。 - Sarz
4
rm命令:/usr/local/var/postgres/postmaster.pid不存在。 - nourza

58
"Postgres.app"是如果您使用的操作系统是OS X的话更好的解决方案。
以下是解决方法:
  1. 停止数据库
  2. cd /var
  3. sudo rm -r pgsql_socket
  4. sudo ln -s /tmp pgsql_socket
  5. chown _postgres:_postgres pgsql_socket
  6. 重新启动 PostgreSQL (不是电脑)
有关详细信息,请参见"postgresql 9.0.3. on Lion Dev Preview 1"。

3
对我来说,错误依旧存在,这个修复方法没有帮助到我。我感觉自己像在黑屋子里碰壁,试图理解实际情况并找到一个自己能够应用修复的过程。请问你能否解释一下我如何诊断和修复这个问题? - Evolve
Postgresapp可以工作,但为什么我无法在终端启动我的服务器?在我退出这个应用程序后,问题就像预期的那样再次出现了。 - hakunami
这对我有用,但请注意,您必须是root用户或使用sudo来执行#2-4。另外,请澄清步骤#5 - 您只需要重新启动postgres,而不是计算机。 - mpelzsherman
2
大写字母并不能让答案更好。通过Homebrew(services)安装和运行Postgres仍然是完全可以的。 - Drenmi
旧答案对我在OS X 10.11上完成的源代码构建有所帮助。但是似乎尝试在postgresql.conf中设置unix_socket_directories = '/tmp'可能会更好...然而,我尝试过了,似乎没有任何区别。有人猜测发生了什么吗? - Weston C
显示剩余2条评论

15

对于你提到的错误,这对我有所帮助。请执行以下其中之一:

  1. 如果你在安装时使用了非默认端口 5432 ,请修改 postgres.conf 文件中指定的默认端口。

  2. 更改 postgresql.conf 中的端口号并重新启动DB服务器。

  3. 不要使用 psql,而是输入完整命令:

    psql -p 5432 -h localhost   
    
    • 服务器名称和端口号

我认为我的安装应该是按照默认设置进行的。 - Evolve
我可以更改这个端口吗?更改端口是否会产生任何影响? - Evolve
  1. 添加了我上面的输出。
- Evolve
选项3使用自定义端口可行。因为我安装了多个pg服务器(PostgreSQL 9.1、9.2和9.3),所以我还必须指向正确的psql。 - gpasse

13

如果您正在使用Homebrew,请卸载Postgresql和pg gems:*

$ gem uninstall pg
$ brew uninstall postgresql

下载并运行以下脚本以修复/usr/local的权限:*https://gist.github.com/rpavlik/768518

$ ruby fix_homebrew.rb

接着重新安装Postgres和pg宝石:

$ brew install postgresql  
$ initdb /usr/local/var/postgres -E utf8

若想在登录时启动PostgreSQL,请运行以下命令:

$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents 

或者手动开始。

安装 pg gem。

$ gem install pg

我希望已经帮到你了


brew info postgres 中获取信息:ARCHFLAGS="-arch x86_64" gem install pg - wrdevos
1
这样做会删除数据库中的记录吗? - kibaekr
initdb /usr/local/var/postgres -E utf8 可以正常工作。非常感谢。 - Chris Jeon

10

1
我收到了这个错误:错误:未安装postgresql 9.3.*版本! - nourza

8

当我升级Postgres到9.3.x时,遇到了这个问题。我的解决方法是降级回之前的任意一个9.2.x版本(无需安装新版本)。

$ ls /usr/local/Cellar/postgresql/
9.2.4
9.3.2
$ brew switch postgresql 9.2.4
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
<open a new Terminal tab or window to reload>
$ psql

"Homebrew安装特定版本的formula?"提供了更全面的解释,以及解决该问题的替代方法。"

感谢您的贡献和清晰的指示以重复您的修复。您包含的链接确实非常全面,我目前没有遇到Postgres方面的问题,因此不确定这对他人有多大帮助,但如果您发现此信息有用,请在此处留言。 - Evolve
我认为这很有用且相关,尽管可能不是直接相关的。他通过使用相当常见的工具brew切换版本并重复步骤来解决问题,到目前为止非常好。然而,链接涉及更多特定于brew的问题,因此我可以理解你在OP问题的背景下对其价值的质疑。 - wkhatch

8
我在 Mac 10.15.5 上使用 homebrew 运行时遇到了这个错误,似乎是一个更加实用的解决方案,在之前的方法无法解决问题时可以尝试。
有一个名为 postmaster.pid 的文件,当 postgresql 退出时会自动删除它。
如果没被删除,请执行以下操作:
- 停止 postgresql:brew services stop postgresql <-- 在 rm 前未能正常退出可能会破坏数据库 - 删除 /usr/local/var/postgres/postmaster.pid 文件。

5
对于这里的许多问题,似乎人们已经在运行psql并不得不删除postmaster.pid。然而,我没有这个问题,因为我从未正确安装过postgres。

以下是在MAC OSX Yosemite中适用的解决方案:

  1. 我去http://postgresapp.com/下载了应用程序。
  2. 我将该应用程序移动到Application/目录中
  3. 我通过将以下内容添加到.bashrc或.bash_profile或.zshrc中,将其添加到$PATH: export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/latest/bin
  4. 我从Applications目录运行postgres,再次运行命令,它就可以工作了。

希望这可以帮助您!拜拜!

此外,这个答案对我最有帮助:https://dev59.com/uWYr5IYBdhLWcg3wka9M#21503349


这不是指向Postgres应用程序而不是brew安装吗?这可能会使您无法使用一些有用的软件包(例如pgrouting,您无法为Postgres应用程序安装它,这给我带来了无尽的痛苦,现在我在这里)。 - allthesignals

4
当您运行以下命令时: psql -p 5432 -h localhost 它不使用回环驱动程序,而是使用真正的套接字,因此需要配置Postgres以接受套接字连接。因此,即使pgadmin和其他客户端可以工作,psql也不会工作。
您需要更改postgresql.conf文件和pg_hba.conf文件,以允许通过真正的套接字进行连接。这也将允许来自远程IP的连接,这就是为什么默认情况下禁用它的原因。
这些文件位于数据目录中,但实际位置可能因安装Postgres的方式而异。在Postgres运行时,运行以下命令:
ps -ef | grep postmaster

这两个文件是-D目录(可能是/usr/local/pgsql/data)。
对于postgresql.conf文件,取消注释listen_address并将其更改为:
listen_address = '*'

对于pg_hba.conf,请添加以下行:

host all all 0.0.0.0/0 md5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接