postgresql:为什么我在运行psql时必须指定-h localhost?

时间:2011-09-10 02:11:11

标签: macos postgresql

psql mydb收益:

psql: could not connect to server: Permission denied
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

psql -h localhost mydb效果很好。 pg_hba.conf看起来像:

local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust

怎么了?

5 个答案:

答案 0 :(得分:8)

我有完全相同的事情发生在我身上,可能是由于psql的冲突版本(一个来自Lion,一个来自自制软件)。虽然我仍然无法弄清楚如何让psql使用/ tmp套接字目录,但我确实有一个解决方法。

将以下内容放在.bashrc(或.zshrc等)中:

export PGHOST=/tmp

这会将正确的“主机”设置回正确的套接字目录,而不必提供-h标志

答案 1 :(得分:3)

可能psql和服务器对unix-domain套接字使用不同的位置。 (/ var / pgsql_socket /是一个奇怪的位置)如果你混合来自不同包的二进制文件,可能会发生这种情况。 尝试找到套接字(/ tmp /是一个好的起点)你可以通过滥用-h选项强制psql使用不同的目录:

psql -h /tmp/

答案 2 :(得分:2)

似乎是reported defect

答案 3 :(得分:2)

在OS X上发生了这种情况,问题在于/usr/bin/psql是我正在使用的,但postmaster是从/Library/PostgreSQL/9.0运行的。使用/Library/PostgreSQL/9.0/bin/psql(在其他所有内容之前将其放入我的PATH)修复了问题。

答案 4 :(得分:1)

由于其他答案解决了其他选择,我想我可以在Lion上提供有关 Mac OS X Server 的内容。我遇到了非常类似的问题 - 在我的情况下,甚至-h localhost都没有工作,因为在PostregSQL中禁用了网络,这在很多情况下是非常好的主意。 Mac OS X Server的用途是通过launchd启动PostgreSQL服务器。

随处可见的一些提示:

  • serveradmin服务:postgres
  • launchd配置文件:/System/Library/LaunchDaemons/org.postgresql.postgres.plist
  • 数据库文件夹:/var/pgsql
  • 套接字文件夹:/var/pgsql_socket

该配置文件会覆盖可在数据库文件夹下的postgresql.conf中找到的多个配置指令。特别是这两个:

  • unix_socket_group
  • unix_socket_permissions

您可以发现_postgres帐户用于运行服务器,如果活跃用户是_postgres组的成员,也可以访问所有内容。

通过运行dscl . -read /Groups/_postgres GroupMembership,您可以看到默认情况下该群组包含以下成员:_devicemgr _calendar _teamsserver _www

我猜你有两个选择。将您自己添加到_postgres组或更改launchd配置plist文件。后者只是纯文本编辑......但要注意安全性,因为这样你就可以将服务器打开到满足你改变标准的任何内容(参见最后一段)。

前者可以通过Server.appdscl命令行实用程序完成。第一个选项可能不需要添加任何内容。只需确保您可以看到系统帐户(查看 - >隐藏/显示系统帐户)。我是一个CLI迷,所以这应该将你的用户添加到_postgres组:

sudo dscl . -append /Groups/_postgres GroupMembership $USER

当然,您应该小心在帐户下运行的内容,因为您可以访问Mac OS X Server数据库后端。因此,要么保护您_postgres帐户,要么创建单独的用户来操纵您的数据库,或者不保存任何私有数据。