无法连接到本地PostgreSQL

时间:2011-12-11 16:25:07

标签: ruby-on-rails macos postgresql

我设法让我的本地开发环境变得很糟糕。

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

我不知道是什么造成的。

在搜索解决方案时,我更新了所有捆绑的宝石,更新了系统宝石,更新了MacPorts。没有快乐。

其他人在从OSX Leopard升级到Lion时报告了这个问题,因为混淆应该使用哪个版本的Postgres(即OSX版本或MacPorts版本)。我已经运行Lion好几个月了,所以现在这应该发生似乎很奇怪。

如果不先了解问题是什么,我就不愿意过多地捣乱。如何有条不紊地调试?

如何确定我的系统中有多少版本的PostgreSQL,正在访问哪一个版本以及它所在的位置?如果使用错误的PostgreSQL,我该如何解决这个问题?

对于noob问题抱歉。我还在学习它是如何工作的!谢谢你的任何指示。

编辑

根据以下建议和评论进行一些更新。

我尝试运行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

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

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

我仍然很困惑如何解决这个问题,并欣赏任何“傻瓜”指针。

谢谢!

EDIT2

此问题在我遇到daemondo问题后开始。我的本地Rails应用程序因“找不到daemondo gem”这样的应用程序错误而崩溃。然后,我进行了一系列捆绑更新,宝石更新,端口更新和brew更新,以尝试找到问题。

这个错误可能是daemondo的问题吗?

21 个答案:

答案 0 :(得分:64)

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

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

您可以为自己更改目录的权限,但套接字由postgresql.conf中的postgres配置。这可以在与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 :(得分:41)

我的直觉是,这是(再次)一个mac / OSX-thing:前端和后端假定unix-domain套接字的不同位置(用作 rendezvous 点)。

清单:

  • postgres正在运行:ps aux | grep postgres | grep -v grep应该诀窍
  • 套接字位于何处:find / -name .s.PGSQL.5432 -ls(套接字曾经位于/ tmp;您可以开始查看)
  • 即使您找到(unix-domain)套接字,客户端也可以使用其他位置。 (如果你混合发行版,或者你在某个地方安装了一个发行版并在其他地方安装了另一个发行版(例如来自源代码),而客户端和服务器使用不同的 rendez-vous 地址,则会发生这种情况。

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

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

(尝试连接到unix-domain套接字)

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

  • psql -h localhost mydbname

(尝试连接到localhost(127.0.0.1)

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

类似的问题:Can't get Postgres started

注意:如果你可以进入psql提示,那么快速解决这个问题就是改变你的config/database.yml,添加:

host: localhost

或者您可以尝试添加:

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

就我而言,host: /tmp

答案 2 :(得分:26)

尝试卸载pg gem(gem uninstall pg)然后重新安装 - 如果您使用bundler,则bundle install,否则gem install pg。此外,确保路径选择正确的版本:Lion有posgresql版本(之前的版本没有),它可能在您本地安装版本之前的路径中(例如MacPorts,自制软件)。

在我的情况下:自制的postgresql安装,更新了postgresql,rails等等,然后出现了这个错误。卸载并重新安装pg gem为我做了。

答案 3 :(得分:20)

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

gem pristine pg
# or
bundle exec gem pristine pg

这应解决该特定问题。

答案 4 :(得分: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,则指定的目录应该不同。

注意:这不是上面看到的确切错误消息,但此线程是该错误消息的第一个结果。

答案 5 :(得分:8)

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

psql: could not connect to server: No such file or directory (Mac OS X)

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

答案 6 :(得分: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

希望这对任何人都有帮助。这似乎有点不对,但是嘿,它有效!

答案 7 :(得分: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

答案 8 :(得分:4)

刚刚确认我在PSQL和Django上有类似的问题,

看起来是因为我的psql服务器没有正确关闭而postmaster.pid文件仍然存在(应该在我的postgres文件夹中自动删除)。

删除了这个和所有好的

答案 9 :(得分:4)

我收到同样的错误(原来这是postmaster.pid的错误。这是我如何让postgres重新启动并再次运行(credit to Ricardo Burillo for the fix):

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

答案 10 :(得分:3)

我读了很多关于这个错误的主题,我的解决方案是简单地重启postgres:

sudo service postgresql restart

这里没有提到。

答案 11 :(得分: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。

答案 12 :(得分:3)

尝试使用带有rails的postgresql时遇到了类似的问题。更新我的Gemfile以使用新版本的gem pg为我解决了这个问题。 (gem pg version 0.16.0有效)。在Gemfile中使用:

gem 'pg', '0.16.0'

然后运行以下内容来更新gem

bundle install --without production
bundle update
bundle install

答案 13 :(得分: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数据库配置文件:)

答案 14 :(得分:2)

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

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

现在运行:

apt-get --purge remove postgresql\*

从系统中删除PostgreSQL的所有内容。仅仅清除postgres包是不够的,因为它只是一个空元数据包。

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

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

你现在应该能够:

apt-get install postgresql

答案 15 :(得分:2)

今天我的Macbook电池耗尽后,这件事发生在我身上。我认为这可能是因为关机不当造成的。在我这样的情况下你所要做的就是删除postmaster.pid

导航到文件夹

cd /usr/local/var/postgres

检查postmaster.pid是否存在

ls

删除postmaster.pid

rm postmaster.pid

答案 16 :(得分:1)

你好世界:)
对我来说最好但最奇怪的方法就是做下一件事。

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

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

export PATH=/Applications/Postgres93.app/Contents/MacOS/bin/:$PATH
这是来自psql的{​​{1}}的路径。每次启动控制台时都会运行行(命令)。

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

4)在完成所有这些操作之后,我很高兴运行/Applications/和其他命令并看到它有效!每次系统启动时都可以运行$ createuser -SRDP user_name

5)此外,如果您想以图形方式查看数据库,则应安装Postgres93.app。这是将postgres DB视为漂亮的数据表

的好方法

当然,它仅对本地服务器有用。如果这些指示可以帮助那些遇到这个问题的人,我将很高兴。

答案 17 :(得分:1)

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

卸载pg gem对我来说很有用。我实际上不得不做一些跳舞来发现这个问题。首先,我做了一个全球宝石卸载,清除所有旧宝石的甲板(有几个)。然后我从我的Gemfile中删除了pg,重新绑定,恢复了pg引用,并再次反弹。

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

答案 18 :(得分:0)

gem uninstall pg

在OS X上使用Homebrew:

gem install pg -- --with-pg-config=/usr/local/bin/pg_config

答案 19 :(得分:0)

我有这个问题困扰着我,经过进一步的调查(运行rake db:setup),我看到rails试图连接到以前使用的postgres实例 - 一个存储在env变量中的DATABASE_URL。

修复:unset DATABASE_URL

来源:https://stackoverflow.com/a/17420624/2577622

答案 20 :(得分:0)

我尝试了解决这个问题的大部分解决办法,但无法解决问题。

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

当我运行pkill postgresql时,流程终于停止了。希望这会有所帮助。