Socket文件“/var/pgsql_socket/.s.PGSQL.5432”在Mountain Lion(OS X Server)中丢失。

98

我刚刚使用OS X Server将我的MacMini服务器从Lion Server升级到Mountain Lion。但是,我遇到了与去年首次安装Lion Server时相同的PostgreSQL问题。

当我尝试执行任何类型的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/pgsql_socket/.s.PGSQL.5432"?

当我尝试更改_postgres的密码时,出现了错误。我尝试了几个命令,但都得到了同样的错误。我刚刚重启了我的服务器,但没有成功。我以root身份登录查看了/var/pgsql_socket文件夹,但该文件夹为空。/var/pgsql_socket_alt文件夹也为空。

我在网上查找了相关信息。然而,我读到的几乎所有解决方案,包括在Stack Overflow上的解决方案,都建议卸载并重新安装PostgreSQL。但我不知道这是否是可行的选择,因为Server App中有几个选项使用PostgreSQL。我联系了苹果企业支持(没有协议),他们告诉我我的问题必须由开发人员解决,这将需要695美元。

我的网站现在已经关闭,因为我无法重建它。我不知道该向谁寻求帮助。我将继续在网上寻找答案。但我希望有人能够快速给我一个答案,这样我就可以重建我的数据库。

更新:12/13/2012 15:33 GMT-6

以下是ps auwx | grep postg的输出:

_postgres      28123   0.0  0.1  2479696   7724   ??  Ss    3:01PM   0:00.04 /Applications/Server.app/Contents/ServerRoot/usr/bin/postgres_real -D /Library/Server/PostgreSQL For Server Services/Data -c listen_addresses= -c log_connections=on -c log_directory=/Library/Logs/PostgreSQL -c log_filename=PostgreSQL_Server_Services.log -c log_line_prefix=%t  -c log_lock_waits=on -c log_statement=ddl -c logging_collector=on -c unix_socket_directory=/Library/Server/PostgreSQL For Server Services/Socket -c unix_socket_group=_postgres -c unix_socket_permissions=0770
server1        28216   0.0  0.0  2432768    620 s000  R+    3:02PM   0:00.00 grep postg
_postgres      28138   0.0  0.0  2439388    752   ??  Ss    3:01PM   0:00.01 postgres: stats collector process                           
_postgres      28137   0.0  0.0  2479828   1968   ??  Ss    3:01PM   0:00.00 postgres: autovacuum launcher process                           
_postgres      28136   0.0  0.0  2479696    544   ??  Ss    3:01PM   0:00.00 postgres: wal writer process                           
_postgres      28135   0.0  0.0  2479696    732   ??  Ss    3:01PM   0:00.01 postgres: writer process                           
_postgres      28134   0.0  0.0  2479696    592   ??  Ss    3:01PM   0:00.00 postgres: checkpointer process                           
_postgres      28131   0.0  0.0  2439388    368   ??  Ss    3:01PM   0:00.00 postgres: logger process 

更新:12/13/2012 18:10 GMT-6

经过大量的网络搜索,我找到了这个视频。我成功地让PostgreSQL工作并移除了错误。我可以使用pgadmin和phppgadmin进行连接。由于极度沮丧,我本来要回到Lion Server。现在不必了。

http://www.youtube.com/watch?v=y1c7WFMMkZ4


23
你的问题归结于 Mac OS X 预安装版本的 PostgreSQL 的 psql 在你自己安装的版本之前出现在了 PATH 中。它们寻找 Unix 套接字的位置不同。要么通过指定 -h localhost 使用 TCP/IP,要么最好修复你的 PATH 以便先找到正确的 psql。苹果公司不仅捆绑 PostgreSQL,而且还将其搞得放置在非标准位置,这是问题的根本原因。 - Craig Ringer
3
在OSX中存在一个持续的问题,打包程序决定将Unix域套接字放在与正常情况不同的位置。让我搜索一下...稍等片刻...https://dev59.com/I2oy5IYBdhLWcg3wkO6g#8482546 - wildplasser
我在.bashrc中复制了一个旧的PATH。我没有安装另一个版本的postgreSQL。这是我的PATH语句,其中包括RVM代码。如果有人能告诉我要改成什么,我会去做的。当我执行which psql时,它被发现在/usr/bin/psql中。非常感谢你们所有人的帮助。我也在以root身份登录时搜索套接字文件。 - Pamela Cook - LightBe Corp
1
对于那些使用 homebrewosx 的人,@CraigRinger 可能有正确的答案,可以通过 brew doctor 进行确认。 - Karthik T
20个回答

306
我能够将以下内容添加到我的 .bash_profile 中以防止出现错误:

我能够将以下内容添加到我的 .bash_profile 中以防止出现错误:

export PGHOST=localhost

这个方法有效,原因是:

如果省略主机名,psql将通过Unix域套接字连接到本地主机上的服务器,或者在没有Unix域套接字的机器上通过TCP/IP连接到localhost。

您的操作系统支持Unix域套接字,但是PostgreSQL需要的Unix套接字并不存在,或者位于与其期望不同的位置。

将主机名显式指定为 localhost 会强制 psql 使用TCP/IP。设置环境变量 PGHOST 是实现此目的的方法之一。具体可以参考 psql 手册。


37
如果您在Rails应用程序中遇到此问题:您可以在database.yml中指定主机。 - dwhalen
12
这是什么巫术?我是说,认真的。你能解释一下吗? - Sreejith Ramakrishnan
1
我总是回到这个答案!又一次救了我的命。这段代码确实应该放在这个页面上,http://postgresapp.com/documentation/cli-tools.html。 - sambecker
1
我不知道为什么,但这对我有效!当我使用“rails db:create”时,我在Rails 5中遇到了这个问题,但我已经在database.yml中设置了host:localhost。@dwhalen - Spark.Bao
1
在将Postgres降级到旧的Homebrew版本后,Rails 5.2可以正常工作,而无需修改database.yml文件,这个错误也随之消失了。 - SexxLuthor
显示剩余3条评论

42

尝试将以下内容粘贴到控制台中:

$ mkdir /var/pgsql_socket/ 

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

最终,我得到了这个答案。 - ABC
很好。尽管我认为我知道为什么这个有效,但更多的解释会很有用。这个解决方案比被接受的答案更好,只是缺少细节。 - Glutexo
@Glutexo MacOS的套接字位置是非标准的。回答者正在为预期和标准位置创建一个新文件夹,然后将非标准的postgres unix套接字位置(/private/tmp/.s.PGSQL.5432)链接到标准位置(/var/pgsql_socket/)。请注意,您可能需要sudo权限。 - Gilbert
我可以确认,在尝试了很多其他方法之后,这个方法对我有效 :) - undefined

23

我只需在PostgreSQL主机地址中填写127.0.0.1而不是留空即可解决问题。(Django示例)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'database_name',
        'USER': 'database_user',
        'PASSWORD': 'pass',
        'HOST': '127.0.0.1',
        'PORT': '',
        }
}

1
我现在感觉有点傻,我已经试图解决这个问题大约两天了。在Windows上,我使用的是“127.0.0.1”,但后来我把我的代码移到生产环境(Debian 7)中,不得不将其更改为“”。很奇怪他们会给出这样的错误信息,让人误以为问题可能出在其他地方。 - fang_dejavu

10

在您喜欢的编辑器中打开“postgresql.conf”文件。查找变量“unix_socket_directories”,它很可能看起来像这样:

unix_socket_directories = '/private/tmp/'

将该行改为:

unix_socket_directories = '/var/pgsql_socket/'

请注意,如果您希望在多个目录中使用套接字文件,请用逗号将它们分开。


这样做的效果是尝试在其他地方创建套接字,但是服务器无法启动,因为它没有在/var目录中创建文件的权限。最终,我不得不更改更高级别的配置文件,以简单地使用最初的套接字。就像这个答案中所提供的那样 https://dev59.com/AmYr5IYBdhLWcg3wNHmh#29511357。 - Eosis

9

7

正如评论中其他人所提到的那样,解决这个问题的一个非常简单的方法就是在数据库配置文件中声明数据库的“host”。我添加这个答案只是为了让任何阅读此内容的人更加清楚。

例如,在Ruby on Rails应用程序中,编辑/config/database.yml:

development:
  adapter: postgresql
  encoding: unicode
  database: database_name
  pool: 5
  host: localhost

注意:最后一行是指定主机的添加。在更新到Yosemite之前,我从来不需要以这种方式指定主机。
希望这可以帮助某些人。
干杯

我需要将我的主机设置为包含.s.PGSQL.5432文件的目录。 - Eosis

5

检查数据库的状态:

service postgresql status

如果数据库未运行,请启动数据库:

sudo service postgresql start

被上述错误卡住了,通过启动数据库解决了它。 - Sivakumar R.J

4

您能检查一下您的postgresql.conf文件吗?

您的postgres运行在哪个端口上?

我认为它没有运行在5432端口上。如果不是,请将其更改为5432。

或者在终端上使用以下命令:

psql -U  postgres -p YOUR_PORT_NUMBER database_name

1
无法运行终端命令。我收到了相同的错误。我需要帮助找到postgresql.conf文件的位置。在运行Lion Server时,我曾经有一个/var/pgsql文件夹。我想现在那个文件夹已经不存在了。我刚刚发布了ps grep命令的输出结果。我打开Wiki服务以便运行PostgreSQL。有人告诉我可以使用sudo serveradmin命令而不必开启任何服务器应用程序服务,但它们不起作用。我现在已经作为root用户登录,所以我应该能做任何事情:)我在Network Utility中检查了端口。5432未被占用。 - Pamela Cook - LightBe Corp

2

如果您使用自定义的PostgreSQL版本,则需要为RubyOnRails应用程序添加localhost

# config/database.yml
default: &default
  host: localhost

这是从Unix套接字移动到网络套接字的解决方案。更好的解决方案是重新编译postrgres gem pg,以匹配由于升级或任何更改而导致的postrgesql上的更改:gep pristine pg - Fa11enAngel

2

我在Django上遇到了这个问题。

通过将您的主机名明确设置为“localhost”来解决它。


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