无法连接本地的PostgreSQL数据库。

126

我的本地开发环境出了问题。

我所有的本地Rails应用现在都会显示以下错误:

PGError
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"?

我不知道是什么原因导致了这个问题。

在寻找解决方法时,我更新了所有捆绑的gems,更新了系统gems,更新了MacPorts,但都没有成功。

其他人在从OSX Leopard升级到Lion时报告了此问题,这是由于对应该使用哪个版本的Postgres(即OSX版本还是MacPorts版本)感到困惑。我已经运行了几个月的Lion,所以现在发生这种情况似乎很奇怪。

我不愿意在充分理解问题之前过度操作。如何有条不紊地调试它?

如何确定我的系统上有多少个PostgreSQL版本,哪一个正在被访问,以及它的位置在哪里?如果使用了错误的PostgreSQL,该怎么办?

对于这些初学者问题,我很抱歉。我还在学习这个!感谢任何指导。

编辑:

根据下面的建议和评论进行了一些更新。

我尝试运行pg_lsclusters,但返回了“command not found”错误。

然后我尝试找到我的pg_hba.conf文件,并找到了这三个示例文件:

/opt/local/share/postgresql84/pg_hba.conf.sample
/opt/local/var/macports/software/postgresql84/8.4.7_0/opt/local/share/postgresql84/pg_hba.conf.sample
/usr/share/postgresql/pg_hba.conf.sample

所以我假设安装了三个版本的PSQL?Macports、OSX默认和???。

然后我搜索了一下launchctl启动脚本ps -ef | grep postgres,返回了以下内容:

0    56     1   0 11:41AM ??         0:00.02 /opt/local/bin/daemondo --label=postgresql84-server --start-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper start ; --stop-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper stop ; --restart-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper restart ; --pid=none
  500   372     1   0 11:42AM ??         0:00.17 /opt/local/lib/postgresql84/bin/postgres -D /opt/local/var/db/postgresql84/defaultdb
  500   766   372   0 11:43AM ??         0:00.37 postgres: writer process                                                                                                                                                                                                                                                                                                                   
  500   767   372   0 11:43AM ??         0:00.24 postgres: wal writer process                                                                                                                                                                                                                                                                                                               
  500   768   372   0 11:43AM ??         0:00.16 postgres: autovacuum launcher process                                                                                                                                                                                                                                                                                                      
  500   769   372   0 11:43AM ??         0:00.08 postgres: stats collector process                                                                                                                                                                                                                                                                                                          
  501  4497  1016   0 12:36PM ttys000    0:00.00 grep postgres

我已经在http://pastebin.com/Gj5TpP62发布了postgresql84-server.wrapper的内容。

我尝试运行port load postgresql184-server,但收到错误提示:Error: Port postgresql184-server not found

我仍然很困惑如何解决这个问题,并感谢任何“白痴式”的指针。

谢谢!

编辑2

这个问题始于我与daemondo有些问题。 我本地的Rails应用程序崩溃并显示应用程序错误,比如“找不到daemondo gem”。然后我进行了一系列的bundle、gem、port和brew更新,以尝试找到问题。

这个错误可能与daemondo有关吗?


请注意,当您的应用程序连接时,它是通过TCP端口连接而不是Unix域套接字连接。因此,您需要配置Postgres以接受网络连接,至少来自本地主机。 - Paul Tomblin
没错。看起来是Mac的问题。在确认postmaster正在运行后,OP可以使用-h标志。 - wildplasser
感谢您提供所有这些建议。我已经编辑了原始问题,并得出了一些结果。非常感谢您的帮助理解和解决此问题。 - Andy Harvey
可能是路径问题。请参考类似的问题:https://dev59.com/Emw15IYBdhLWcg3wMY6L - boulder_ruby
显示剩余2条评论
21个回答

67

看起来像是一个文件权限错误。Unix域套接字就像任何其他文件一样具有用户权限。似乎尝试访问数据库的OSX用户没有访问套接字文件的文件权限。为了确认这一点,我在Ubuntu上进行了一些测试并尝试使用psql生成相同的错误(如下所示)。

您需要检查套接字文件及其目录/var/var/pgsql_socket的权限。您的Rails应用程序(OSX用户)必须对这些目录授予执行(x)权限(最好授予每个人权限),并且套接字应该具有完全权限(wrx)。您可以使用ls -lAd <file>来检查这些,并且如果其中任何一个是符号链接,则需要检查链接指向的文件或目录。

您可以更改自己的目录权限,但是套接字由postgres在postgresql.conf中配置。它可以在与pg_hba.conf相同的目录中找到(您将不得不弄清楚哪一个)。设置权限后,您将需要重新启动PostgreSQL。

# postgresql.conf should contain...
unix_socket_directory = '/var/run/postgresql'       # dont worry if yours is different
#unix_socket_group = ''                             # default is fine here
#unix_socket_permissions = 0777                     # check this one and uncomment if necessary.

编辑:

我已经在谷歌上进行了快速搜索,你可能希望查看一下这些结果,以确定它是否相关。 这很可能导致任何尝试查找您的配置文件都会失败。

http://www.postgresqlformac.com/server/howto_edit_postgresql_confi.html


错误消息:

在pg_hba.conf中未找到用户。

psql: FATAL:  no pg_hba.conf entry for host "[local]", user "couling", database "main", SSL off

用户密码认证失败:

psql: FATAL:  password authentication failed for user "couling"

缺少Unix套接字文件:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Unix套接字存在,但服务器未监听。

psql: could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

在Unix套接字文件上存在错误的文件权限:

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

1
感谢@couling提供的这些想法。这感觉是正确的方向。但是我的设置有些非常奇怪。请记住,直到最近,这一切都运行得非常完美。我已经查看了系统上的三个postgres目录,它们都包含conf.sample文件(pg_hba、pg_ident、pg_service等),但没有.conf文件。这不应该是这种情况,对吧?此外,应该包含.s.PGSQL.5432的目录为空。相反,我在/private/tmp/.s.PGSQL.5432.lock处找到了一个文件。PS返回postgres进程,因此正在运行。感到困惑! - Andy Harvey
1
浏览我的目录并找到正确的文件花费了一些时间,但这确实是问题所在。感谢您提供如此详细的答案。一旦我找到了正确的目录,我需要在postgresql.conf中设置套接字目录、数据目录、hba_file和ident_file。谢谢! - Andy Harvey
1
可能会对一些人有所帮助:我使用brew在我的账户下安装了postgres。在我的情况下,发现文件夹/var/pgsql_socket/的所有者是用户_postgres,将所有权更改为我的账户(darren)解决了这个问题。不确定为什么brew一开始没有正确设置这个文件夹的所有权...? - Darren Jensen
这个答案与https://dev59.com/deo6XIcBkEYKwwoYOR4q的结合真的很有帮助。 - Amy.js
从下面的答案中,我实际上发现套接字是 /private/tmp/.s.PGSQL.5432,将主机设置为“localhost”就可以解决问题,非常奇怪。 - concept47
显示剩余2条评论

41

我直觉认为这可能又是一个与 Mac/OSX 相关的问题:前端和后端假定 unix 域套接字(用作 rendezvous点)的位置不同。

检查清单:

  • Postgres 是否正在运行:可以使用ps aux | grep postgres | grep -v grep命令来确认
  • 套接字的位置在哪里:find / -name .s.PGSQL.5432 -ls(套接字曾经在 /tmp 中,您可以从那里开始寻找)
  • 即使找到了(Unix 域)套接字,客户端也可能使用不同的位置。这种情况发生在混用不同发行版或在某处安装了一个发行版并在其他地方安装了另一个(例如源代码)的情况下,客户端和服务器使用不同的 rendez-vous 地址。

如果 Postgres 正在运行,并且套接字实际上存在,您可以使用以下命令:

  • psql -h /the/directory/where/the/socket/was/found mydbname

(这将尝试连接到 Unix 域套接字)

; 现在您应该可以得到 psql 提示符:尝试输入\d,然后输入\q退出。您也可以尝试:

  • psql -h localhost mydbname

(这将尝试连接到 localhost (127.0.0.1))

如果由于权限不足而导致这些尝试失败,您可以修改 pg_hba.conf(并执行 SIGHUP 或重启)。在这种情况下:还要检查日志。

类似的问题:无法启动 Postgres

注意:如果您可以进入 psql 提示符,则此问题的快速解决方法只是更改您的 config/database.yml,添加:

host: localhost

或者您可以尝试添加:

主机: /找到套接字的目录/

在我的情况下,主机:/tmp


1
@wildplasser 感谢您的回答。这让我朝着正确的方向开始了,而 couling 的详细回答则给出了解决方案。 - Andy Harvey
7
将主机localhost添加到我的database.yml中解决了我的问题。谢谢 :) - Automatico
1
我的在 /private/.... 很奇怪。我已经使用 brew 安装了它,但这台笔记本之前也有问题。很奇怪。那个 database.yml 是关键! - pjammer
4
奇怪。将“localhost”添加到我的database.yml中也起作用了,但为什么呢?之前我没有添加过,而且一切都很正常。但我不认为我最近添加了任何东西,突然间就这样了。> _ < - index
1
对我来说,关键是套接字路径——它在/run而不是/var/run——谢谢! - qodeninja
显示剩余7条评论

26

尝试卸载 pg gem (gem uninstall pg) 然后重新安装 - 如果使用 bundler,则运行 bundle install,否则运行 gem install pg。此外,请确保路径选择正确的版本:Lion 有一个 posgresql 的版本(之前的版本没有),它可能在本地安装的版本(例如 MacPorts、Homebrew)之前出现在路径中。

在我的情况下:homebrew 安装了 postgresql,更新了 postgresql、Rails 等等,然后出现了这个错误。卸载并重新安装 pg gem 对我有用。


8
执行 "bundle exec gem pristine pg" 命令也可以解决问题。 - Ben Walding
我毫不怀疑,OP的错误可能是由许多原因引起的,但这是对我有效的解决方案。 - redhotvengeance

20

套接字文件的位置是在编译时包含在宝石中的。因此,您需要重新构建pg宝石。

gem pristine pg
# or
bundle exec gem pristine pg

这应该解决那个特定的问题。


在将Postgres从9.1x升级到9.3x后,我开始遇到了这个问题。这个答案解决了我的问题(向database.yml添加'localhost'也可以解决,但我更喜欢这种方法)。 - Joshua Flanagan

15

如果你遇到类似的错误:

psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

这个方法可能有用(对我来说确实有效):

initdb /usr/local/var/postgres -E utf8

如果您不使用OSX/Brew,指定的目录应该是不同的。

注意:这不是上面显示的确切错误消息,但本帖是该错误消息的第一个结果。


6
我经常会遇到这个问题,但是这是我第一次用这个解决方案解决它。另外,在运行“initb”之前,必须执行“rm -fr /usr/local/var/postgres”。 - Raf
1
在我完成这个(Neal 和 Raf 都做了)之后,我遇到了“致命错误”数据库不存在的问题。然后我运行了“rake db:create:all”和“rake db:migrate”,最终一切都恢复正常了。 - Deborah
我还需要执行 rm -rf /usr/local/var/postgres 然后执行 initdb /usr/local/var/postgres -E utf8。但请确保在执行此操作时,postgres未在运行,否则该目录会立即重新创建。 - Josh W Lewis

8

由于这里接受的答案指出了文件权限问题,因此显然您的帖子和这个帖子没有关联。 - Andrew Barber

7

这是我根据wildplasser的答案部分解决该错误信息的方法。

find / -name .s.PGSQL.5432 -ls 2> /dev/null
  => ... /tmp/.s.PGSQL.5432

所以,这里有我的套接字或者其他东西,但是客户端在以下位置寻找它:

/var/run/postgresql/.s.PGSQL.5432

所以简单地向/tmp/.s.PGSQL.5432创建一个符号链接:

sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

希望这对任何人有所帮助。虽然看起来有些不对,但是嘿,它能够正常工作!

1
这对我有用:sudo ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/.s.PGSQL.5432 - port5432
谢谢 :) 这很有帮助。但在创建符号链接之前,请不要忘记创建 sudo mkdir /var/run/postgresql 文件夹(在我的情况下,它不存在,并且安装程序未为 pg 9.3.X 创建它)。 - kovpack
2
哦,原来这个解决方案是“一次性”的解决方案,每次重新启动后都必须重新做。对于Rails,我找到了另一个解决方案-修改数据库配置文件(在下面添加了答案)。 - kovpack

6
我开始在升级到新的Postgres之后遇到了这个问题 - 我没有意识到我有旧的数据文件。
首先,我尝试启动Postgres服务器:
postgres -D /usr/local/var/postgres

这就是我看到这个错误的方式

FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.0, which is not compatible with this version 9.3.5.

然后我在SO上找到了一个解决不兼容错误的答案:https://serverfault.com/questions/342626/how-do-i-upgrade-postgresl-database-incompatibility-error

这就是修复它的方法

mv /usr/local/var/postgres /usr/local/var/postgres.old
initdb -D /usr/local/var/postgres

4

我确认在PSQL和Django上遇到了类似的问题,看起来是因为我的psql服务器没有正确关闭,postmaster.pid文件仍然存在(postgres文件夹中应自动在正确关闭时删除)。

删除该文件后一切正常。


2
这就是解决我的问题的方法。我的电脑死机了,我不得不强制关闭。当我重新启动后,postgres显示“psql:无法连接到服务器:没有这样的文件或目录。”从“/usr/local/var/postgres”中删除“postmaster.pid”使一切再次正常工作。 - Ryan Epp
1
这也是发生在我身上的事情。我的Mac由于内核恐慌而重新启动,所以我不得不在继续工作之前删除postmaster.pid文件。 - Ben

4

我曾经遇到过同样的错误(后来发现是 postmaster.pid 出了问题)。以下是我重新启动postgresql数据库的步骤(感谢 Ricardo Burillo 提供的解决方案):

$ rm /usr/local/var/postgres/postmaster.pid 
$ pg_resetxlog -f /usr/local/var/postgres

这对我有用,尽管 pg_resetxlog 返回了 lock file "postmaster.pid" exists - Elise

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