【问题标题】:postgresql: Why do I have to specify -h localhost when running psql?postgresql:为什么在运行 psql 时必须指定 -h localhost?
【发布时间】:2011-09-10 02:11:11
【问题描述】:

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

怎么了?

【问题讨论】:

    标签: macos postgresql


    【解决方案1】:

    我也遇到了完全相同的事情,大概是由于 psql 的版本冲突(一个来自 Lion,一个来自 homebrew)。虽然我仍然无法弄清楚如何让 psql 使用 /tmp 套接字目录,但我确实有一个解决方法。

    将以下内容放入您的 .bashrc(或 .zshrc 等):

    export PGHOST=/tmp
    

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

    【讨论】:

      【解决方案2】:

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

      psql -h /tmp/
      

      【讨论】:

      • +1 表示-h 开关,它也适用于本地连接(正斜杠开头)。 Unix 域套接字的路径由postgresql.conf 中的unix_socket_directory 属性确定。
      • 'unix_socket_directory' 属性可以为空(我从未见过它设置),在这种情况下,它可能默认为 /tmp/。
      • 感谢您的提示-我正在使用来自 postgres 的标准 OS X 软件包,它解释了 unix-domain 套接字设置。
      【解决方案3】:

      它似乎是reported defect

      【讨论】:

        【解决方案4】:

        这发生在我的 OS X 上,问题是我使用的是 /usr/bin/psql,但 postmaster 是从 /Library/PostgreSQL/9.0 运行的。使用/Library/PostgreSQL/9.0/bin/psql(首先将其放入我的PATH)解决了这个问题。

        【讨论】:

          【解决方案5】:

          由于其他答案解决了其他选择,我想我可以在 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 来满足您更改的任何条件(请参阅最后一段)。

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

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

          当然,您应该小心在您的帐户下运行的内容,因为您正在授予对 Mac OS X Server 数据库后端的访问权限。因此,要么保护您的 _postgres 帐户,要么创建单独的用户来操作您的数据库,或者不要在那里保存任何私人信息。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多