升级到OSX 10.7 Lion后修复Postgresql


196

我最近升级到OSX 10.7,此时尝试连接到psql服务器时,我的rails安装完全失败了。当我从命令行使用

psql -U postgres

它完全可以正常工作,但是当我尝试使用相同的用户名和密码运行Rails服务器或控制台时,出现此错误

...activerecord-3.0.9/lib/active_record/connection_adapters/postgresql_adapter.rb:950:in `initialize': could not connect to server: Permission denied (PGError) 
Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

任何想法可能会发生什么将是超级有帮助!谢谢!


这也打了我办公室里的人。我们在获取错误的二进制文件时遇到了类似的问题,在尝试以不同的权限连接到不同目录中的域套接字时遇到了另一个问题,并且看起来升级过程吞噬了本地数据库中的所有数据。幸运的是,这只是一个开发箱,所以这不是什么大问题,但是有点令人讨厌。:)

1
我今天自己打过这个,记得昨天读过你的问题。很高兴看到@John Wang出来并解释了它:)
Ryan Bigg

Answers:


291

这是一个路径问题。Mac OSX Lion现在在系统中包含Postgresql。如果您这样做,which psql您可能会看到usr/bin/psql而不是usr/local/bin/psqlHomeBrew的正确选择。如果运行,brew doctor您将收到一条消息,指出您需要添加usr/local/bin到PATH env变量的开头。

编辑.bash_profile或.profile或您正在使用的任何shell并添加: export PATH=/usr/local/bin:$PATH

作为第一个导出,PATH然后退出您的Shell会话或使用您的文件作为源source ~/.bash_profile,现在它应该又可以了。


12
这样就解决了。您还可以编辑/ etc / paths并确保/ usr / local / bin位于顶部
Greg

153
另外,请注意,如果在修复路径之前安装了pg gem,它将使用错误的psql。如果是这样,请卸载pg gem,然后重新安装(gem卸载pg && gem安装pg)。
Troy

4
这是自制的吗?端口似乎放在其中:/ opt / local / lib / postgresql91因此,请确保使用export PATH = / opt / local / lib / postgresql91 / bin:$ PATH
Antony Stubbs

1
我的路径报告正确,但是Troy的解决方案是卸载pg gem,然后让bundler重新安装对我来说是成功的窍门。
汤姆·哈里森

2
只是为了澄清-似乎最好是正确设置路径,然后卸载/重新安装pg gem
Jamie Cook

90

对于那些您感兴趣的人,我拼凑了解决方案。我只需要添加

host: localhost

到我的环境中的database.yml,一切都是肉汁。


9
请注意以下事项:此设置会将访问权限从域套接字更改为TCP连接。尽管它可能会起作用,但您可能会损失一些性能和机器上的可用端口,这可能会因设置而异。约翰提供的解决方案是正确的。
pilif

3
“卸载pg”(选择所有版本),然后再次“捆绑”以从您的Gemfile安装pg版本对我有用。
tmadsen 2012年

感谢Dave G,这也对我有用。我安装了10.7.3更新,并抱怨db:migrate。这样就解决了。
Sathish 2012年

这也对我有用。但是,我将密码和用户名留为空白。
本杰明·2012年

我想这会起作用,因为它会强制进行TCP / IP连接。
duma 2012年

46

我在Mountain Lion遇到了这个问题,但是对我有用的唯一解决方法是

检查实际目标在哪里:

sudo find / -name .s.PGSQL.5432

我需要创建此目录:

mkdir /var/pgsql_socket/

然后使用上面查找的结果创建此符号链接:

ln -s /private/tmp/.s.PGSQL.5432 /var/pgsql_socket/

我怀疑对于Mountain Lion上的大多数人,您可以创建目录并执行符号链接,而不会浪费时间进行查找,除非符号链接不起作用。

PS-我的PostgreSQL是通过官方安装程序安装的。


我有一种感觉,可能对我来说却无法解决。我得到这个:ln:/ var / pgsql_socket /:没有这样的文件或目录
Emmanuel

对不起,我忘了我也遇到了。添加了额外的步骤来回答。
2012年

祝福你本。非常感激。
马特

29

如果在更改路径后问题仍然存在(就像对我所做的那样),请尝试以下操作...

gem pristine pg

看来问题(部分)在于pg gem本身。生成时,它会确定域套接字应该在哪里。如果在更改事实后更改域套接字的位置,则在重新构建gem之前,该套接字似乎不会生效。


即使我修复了PATH并重新安装了没有原始的pg gem后,这对我仍然有效。
艾略特·温克勒

谢谢你的贴士,达伦
怪癖

15

对于直接从官方安装程序安装的用户,只需将主机添加到命令即可,无需更改路径:

psql -h localhost -U postgres

5

我遇到了同样的问题,但是在使John Wang的解决方案起作用时遇到了问题。正如Darren指出的那样,pg宝石存在问题。要使其正常工作,我需要:

gem uninstall pg

然后重新安装。

哪个起作用了。


我不得不运行两次...奇怪。我确实卸载了pg,然后捆绑安装,但失败了。然后,gem安装了pg,它就起作用了。谢谢!
达斯汀

3

我也遇到了这个问题,但是我自己安装了postgres(不使用自制软件)。如果是这样,您需要找到psql的旧路径(可能是/ usr / local / bin,但对我来说是/ usr / local / pgsql / bin),并将其放在$ PATH之前。

(之前) which psql=> / usr / bin / psql

(修复)导出PATH = / usr / local / psql / bin:$ PATH

(之后)`which psql'=> / usr / local / psql / bin

John Wang的建议,source ~/.bash_rc之后将其添加到您的bash_rc中是黄金。



1

我不满意最受好评的答案,因为它们要么是特定于操作系统用户的,要么是将Postgres重新映射为使用TCP而不是域套接字,如@pilif所指出的那样。我已经看到了另一种解决方案,该方案涉及在系统级别对默认路径进行重新排序,以在核心系统路径之前检查Brew的路径,但这似乎很危险,因为它可能会影响像这样的所有其他应用程序名称冲突。

该站点详细介绍了我的同事找到的解决方案。归结为执行单个shell脚本,该脚本将

  1. 在单独的目录中备份Postgres 8.4文件
  2. 将啤酒的Postgres安装符号链接到位

需要注意的是,系统默认的Postgres是安装的brew,因此您必须做出判断是否适合您的判断。我看不到自己需要Postgres 8.4而不是9.x,但是YMMV


1

对我有用的另一个可能的解决方案是通过删除postmaster文件来重置它。只需运行:

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

值得检查日志中的错误,您可以在这里找到:

/usr/local/var/postgres/server.log

我收到的错误消息是:

FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 161) running in data directory 
"/usr/local/var/postgres"?

之后一切都很好。


我仅在命令行中遇到了问题。删除文件/usr/local/var/postgres/postmaster.pid解决了我的问题。
Michael A.

0

在我的情况下,服务器由于共享内存设置错误而无法启动。起初我很困惑,因为有几个postgres进程正在运行,但是它们是标准的系统进程。寻找postmaster过程!

我要做的就是更改共享内存设置。在我的情况下,无需摆弄路径设置。



0

如果您希望永久更改$ PATH,请尝试以下操作:

defaults write $HOME/.MacOSX/environment PATH "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/opt/local/bin"

这将重写您的~/.MacOSX/environment.plist


0

我是Rails的新手,但是将以下内容添加到database.yml对我来说很有效:

host: localhost

port: 5432

不知道为什么Rails默认使用域套接字而不是TCP,而PostgreSQL默认不设置域套接字。


0

我的PostgreSQL安装在/ Library / PostgreSQL中,所以/ usr / var的东西对我不起作用。

似乎沃兹是正确的,因为每次我关闭macbook pro的盖子时,它就会崩溃...这是崩溃后对我有效的方法:

sudo su postgres -c "/Library/PostgreSQL/9.2/bin/pg_ctl -m fast -D /Library/PostgreSQL/9.2/data restart"
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.