无法连接到本地PostgreSQL


124

我设法弄清了本地开发环境。

我所有的本地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"?

我不知道是什么原因造成的。

在寻找解决方案时,我已经更新了所有捆绑的gem,更新的系统gem,更新的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

所以我假设安装了3个版本的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

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

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

我仍然很困惑如何解决此问题,并感谢任何“傻瓜”指针。

谢谢!

编辑2

我在使用daemondo遇到一些问题后开始出现此问题。我的本地Rails应用程序崩溃,并出现“找不到daemondo gem”错误。然后,我经历了一系列捆绑更新,gem更新,端口更新和brew更新,以尝试找到问题。

这个错误可能是守护程序的问题吗?


请注意,当您的应用程序连接时,它是通过tcp端口而不是unix域套接字连接的。因此,您需要配置postgres以接受网络连接,至少从本地主机开始。
Paul Tomblin

你为什么这么相信?显然,驱动程序正在尝试通过Unix套接字进行连接。尽管他们在错误的位置寻找插座。
Milen A. Radev


究竟。这似乎是一件大事。在确认邮局主管正在运行后,OP可以使用-h标志。
wildplasser 2011年

请张贴的输出pg_lsclusters和你的pg_hba.conf文件。
tscho 2011年

Answers:


66

这确实看起来像是文件权限错误。Unix域套接字是文件,并且与其他端口一样具有用户权限。似乎试图访问数据库的OSX用户没有文件权限来访问套接字文件。为了确认这一点,我已经在Ubuntu和psql上进行了一些测试,以尝试生成相同的错误(包括在下面)。

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

您可以自己更改dir的权限,但是套接字是由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.

编辑:

我已经在google上进行了快速搜索,您可能希望调查一下它是否相关。这很可能导致对find配置文件的任何尝试失败。

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进程,使其正在运行。困惑!
安迪·哈维

我添加了一个额外的链接。据我所知,没有postgresql.conf,就不能真正拥有postgresql(即使已重命名)。您的首要任务必须是找到它。
菲利普·库林

1
花了一些时间来浏览我的目录并找到正确的文件,但这确实是问题所在。感谢您提供非常详细的答案。找到正确的目录后,需要在postgresql.conf中设置套接字目录,数据目录,hba_file和ident_file。谢谢!
安迪·哈维

1
可能会对某些人有所帮助:我使用brew在我的帐户下安装postgres。就我而言,事实证明文件夹/ var / pgsql_socket /由用户_postgres拥有,并且将所有权更改为我的帐户(达伦)解决了该问题。不知道为什么brew首先没有正确设置此文件夹的所有权...?
达伦·詹森

谢谢你的呼唤。我无法连接,设置unix_socket_directory是正确的选择。
Ryan Bigg

41

我的直觉是,这(再次)是mac / OSX:前端和后端为unix域套接字(充当集合点)假定了不同的位置。

清单:

  • Postgres是否正在运行:ps aux | grep postgres | grep -v grep应该做到
  • 套接字在哪里:(find / -name .s.PGSQL.5432 -ls该套接字曾经在/ tmp中;您可以开始在那看)
  • 即使您找到(unix域)套接字,客户端也可以使用其他位置。(如果您混合使用发行版,或者您在某个地方安装了发行版,而在其他地方安装了另一个发行版(例如,从源代码安装),则发生这种情况,客户端和服务器使用不同的集合地址。

如果postgres正在运行,并且套接字确实存在,则可以使用:

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

(它尝试连接到Unix域套接字)

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

  • psql -h localhost mydbname

(它尝试连接到本地主机(127.0.0.1)

如果由于授权不足而导致这些尝试失败,则可以更改pg_hba.conf(以及SIGHUP或重新启动)。在这种情况下:还要检查日志。

一个类似的问题:无法启动Postgres

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

host: localhost

或者您可以尝试添加:

host: /the/directory/where/the/socket/was/found

就我而言 host: /tmp


1
@wildplasser感谢您的回答。这使我朝着正确的方向开始,而库林的详细答案给出了解决方案。
安迪·哈维

6
将主机:localhost添加到我的数据库。yml解决了我的问题。谢谢:)
Automatico

1
我的在/ private / ....很奇怪。我酿造了它,但是这台笔记本电脑以前也有问题。奇怪的。那database.yml是关键!
pjammer 2012年

4
奇怪的。将“ localhost”添加到我的database.yml也可以,但是为什么呢?我以前没有那个,一切都很好。但是我不认为我最近添加了任何东西,突然之间就已经那样了。> _ <
索引

1
对我来说,这里的窍门是套接字路径-它位于/ run中,而不是/ var / run中-谢谢!
qodeninja

26

尝试卸载pg gem(gem uninstall pg),然后重新安装-如果使用捆绑程序,则使用bundle install,否则gem install pg。另外,确保路径选择正确的版本:Lion具有posgresql版本(以前的版本没有),并且它可能位于本地安装版本之前的路径中(例如MacPorts,自制软件)。

就我而言:自制安装postgresql,更新postgresql,rails等,然后出现此错误。卸载并重新安装pg gem可以帮到我。


8
捆绑EXEC宝石原始的PG <==也将这样的伎俩
奔瓦尔丁

毫无疑问,OP的错误可能是由多种原因引起的,但这是对我有用的解决方案。
redhotvengeance,2012年

20

套接字文件的位置在编译时被烘焙到gem中。因此,您需要重建pg gem。

gem pristine pg
# or
bundle exec gem pristine pg

这应该解决该特定问题。


在将Postgres从9.1x升级到9.3x之后,我开始得到此问题中描述的问题。这个答案为我解决了(将'localhost'添加到我的database.yml中,但是我更喜欢这种方法)。
约书亚·弗拉纳根

16

如果您遇到类似的错误:

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
我总是时不时地遇到这个问题,但这是我第一次使用此解决方案解决它。此外,必须rm -fr /usr/local/var/postgres在跑步之前initb
Raf

1
完成此操作后(包括Neal和Raf),我得到了“致命”数据库不存在的错误。因此,然后运行“ rake db:create:all”和“ rake db:migrate”,最后一切再次正常运行。
德博拉

rm -rf /usr/local/var/postgres那时候我也不得不做initdb /usr/local/var/postgres -E utf8。但是,请确保在执行此操作时postgres没有运行,否则该目录将立即被重新创建。
乔什·刘易斯

8

为我解决了此错误的原因是删除了postgres目录中的一个名为postmaster.pid的文件。请使用以下链接查看我的问题/答案,以获取逐步说明。我的问题与文件权限无关:

psql:无法连接到服务器:没有这样的文件或目录(Mac OS X)

回答这个问题的人虽然放弃了很多游戏,但谢谢!我全力支持


由于此处接受的答案指出了文件权限问题,因此看来您的帖子与此帖子似乎无关。
Andrew Barber 2012年

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
ardochhigh

谢谢:)这有所帮助。但是在进行符号链接之前,请不要忘记创建sudo mkdir /var/run/postgresql文件夹(在我的情况下,id不存在,并且不是由pg 9.3.X的安装程序创建的)。
kovpack 2014年

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服务器未正确关闭,并且postgres文件夹中仍然存在postmaster.pid文件(应在正确关闭时自动删除)。

删除了这一切都很好


2
这就是为我解决问题的原因。我的电脑死机了,我不得不硬关机。当我开始备份它时,postgres说“ 从中psql: could not connect to server: No such file or directory.删除” 使一切再次正常运行。postmaster.pid/usr/local/var/postgres
Ryan Epp

1
这也是我发生的事情。由于内核崩溃,我的Mac重新启动了,我不得不删除postmaster.pid才能恢复工作。
2014年

4

我遇到了同样的错误(事实证明这是一个错误postmaster.pid。这是我重新启动postgres的方式(感谢Ricardo Burillo的修复):

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

这对我有用,尽管pg_resetxlog返回的锁定文件“ postmaster.pid”存在。
Elise 2015年

3

尝试将Postgresql与Rails一起使用时,我遇到了类似的问题。更新我的Gemfile以使用新版本的gem pg为我解决了这个问题。(gem pg版本0.16.0可以使用)。在Gemfile中使用:

gem 'pg', '0.16.0'

然后运行以下命令更新gem

bundle install --without production
bundle update
bundle install

1
这也为我解决了这个问题。我从Rails 4.0 beta开始使用0.15.1,现在使用Ruby 2.0.0。一旦我升级到pg 0.16.0,问题就解决了。
bratsche

在4.1.0.beta1上为我解决了问题
Andreas

3

我读到了很多有关此错误的主题,而我的解决方案是仅使用以下命令重新启动postgres:

sudo service postgresql restart

这里没有提到。


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

我搜索了一段时间。因此,这也为我解决了这个问题(reinit db):

rm -r /usr/local/var/postgres  
initdb /usr/local/var/postgres -E utf8  
pg_ctl -D /usr/local/var/postgres -l logfile start

我将OS X 10.11.3与brew一起使用。


2

今天,这是我的Macbook电池没电了之后发生的事情。我认为这可能是由于关机不当引起的。在我的情况下,您要做的就是删除postmaster.pid

导航到文件夹

cd /usr/local/var/postgres

检查是否存在postmaster.pid

ls

删除postmaster.pid

rm postmaster.pid

2

就我而言,以前的解决方案都不好。除了使用套接字,还可以在Rails配置文件中使用TCP host+ port数字。因此,在database.yml文件中只需添加两行,如下所示:

...
adapter: postgresql
encoding: unicode
pool: 5
host: localhost
port: 5432

这解决了我的问题:)

在使用此修复程序之前:

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

但是每次/tmp/.s.PGSQL.5432删除重新启动后,我都不得不重复这些命令。解决方案有效,但它太可怕了,所以最好修改Rails数据库配置文件:)


2

当我使用Django设置Posgtres时出现此错误,我使用的是Back Track,并且安装了Postgres。我认为设置是问题所在。我通过将其完全删除然后重新安装来修复它。

sudo apt-get remove postgresql
sudo apt-get purge postgresql

现在运行:

apt-get --purge remove postgresql\*

从系统中删除所有PostgreSQL。仅清除postgres软件包是不够的,因为它只是一个空的meta软件包。

删除所有PostgreSQL软件包后,运行:

rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

您现在应该能够:

apt-get install postgresql

1

MacOSX在这里。使用自制软件将postresql安装从9.1之前的版本升级到9.1.2之后,我遇到了同样的问题。(顺便说一句,请记住在升级pg_dump之前转储数据库,因为9.1之前的数据库不兼容。)同样的问题,同样的错误消息。

卸载pg gem对我有用。实际上,我不得不跳很多舞才能发现问题。首先,我进行了全局的gem卸载,清理了所有旧gem(有一些)的平台。然后,我从Gemfile中删除了pg,重新打包,恢复了pg的引用,然后再次反弹。

在那之后,它就像一个魅力。


1

你好,世界:)
对我而言,最好的但奇怪的方法是做下一件事情。

1)下载postgres93.app或其他版本。将此应用添加到/ Applications /文件夹中。

2)在文件中添加一行(命令).bash_profile(位于我的主目录中):

导出PATH = / Applications / Postgres93.app / Contents / MacOS / bin /:$ PATH
这是psql从的路径Postgres93.app。该行(命令)在每次启动控制台时运行。

3)Postgres93.app/Applications/文件夹启动。它启动本地服务器(端口为“ 5432”,主机为“ localhost”)。

4)经过所有这些操作后,我很高兴运行$ createuser -SRDP user_name命令和其他命令,并看到它起作用了!Postgres93.app可以在系统每次启动时运行。

5)另外,如果您想以图形方式查看数据库,则应安装PG Commander.app。这是将Postgres DB视为漂亮的数据表的好方法

当然,它仅对本地服务器有用。如果本说明能帮助遇到此问题的其他人,我将感到很高兴。



0

我尝试了解决此问题的大多数解决方案,但无济于事。

我跑了出来lsof -P | grep ':5432' | awk '{print $2}',显示了正在运行的进程的PID。但是我不能用杀死它kill -9 <pid>

当我运行时,pkill postgresql该过程终于停止了。希望这可以帮助。


0
gem uninstall pg

在带有Homebrew的OS X上:

gem install pg -- --with-pg-config=/usr/local/bin/pg_config
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.