关于ruby on rails:无法连接到本地PostgreSQL

Can not connect to local PostgreSQL

我设法让我的本地开发环境变得笨拙。

我所有的本地Rails应用程序现在都给出错误:

1
2
3
4
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,我该如何解决这个问题?

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

编辑

一些更新基于以下建议和评论。

我试图运行pg_lsclusters,返回command not found错误。

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

1
2
3
/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

1
2
3
4
5
6
7
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的问题吗?


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

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

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

1
2
3
4
# 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.

编辑:

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

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

错误消息:

在pg_hba.conf中找不到用户

1
psql: FATAL:  no pg_hba.conf entry FOR host"[local]", USER"couling", DATABASE"main", SSL off

用户密码验证失败:

1
psql: FATAL:  password authentication failed FOR USER"couling"

缺少unix套接字文件:

1
2
3
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套接字存在,但服务器没有收听它。

1
2
3
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套接字文件的文件权限错误:

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


我的直觉是,这是(再次)一个mac / OSX-thing:前端和后端假定unix-domain套接字的另一个位置(它作为一个集合点)。

清单:

  • 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或重新启动)在这种情况下:还要检查日志。

一个类似的问题:无法让Postgres开始

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

host: localhost

或者您可以尝试添加:

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

就我而言,host: /tmp


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

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


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

1
2
3
gem pristine pg
# OR
bundle EXEC gem pristine pg

这应解决该特定问题。


如果您遇到类似的错误:

1
2
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"?

这可能会成功(它为我做了):

1
initdb /usr/LOCAL/var/postgres -E utf8

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

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


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

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

回答这个问题的人们放弃了很多游戏,谢谢!我尽我所能


这是我解决该错误消息的方式,部分基于wildplasser的答案。

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

所以,有我的套接字或其他什么,但客户端寻找它:

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

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

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

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


我升级到新的postgres后开始得到这个 - 我没有意识到我已经保存了数据文件。

首先,我尝试启动postgres服务器:

1
postgres -D /usr/LOCAL/var/postgres

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

1
2
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

这就是修复它的原因

1
2
mv /usr/LOCAL/var/postgres /usr/LOCAL/var/postgres.old
initdb -D /usr/LOCAL/var/postgres

我得到了同样的错误(事实证明这是一个错误postmaster.pid。这是我如何得到postgres并再次运行(归功于Ricardo Burillo的修复):

1
2
$ rm /usr/LOCAL/var/postgres/postmaster.pid
$ pg_resetxlog -f /usr/LOCAL/var/postgres


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

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

删除了这一切,一切都很好


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

1
gem 'pg', '0.16.0'

然后运行以下命令来更新gem

1
2
3
bundle install --without production
bundle UPDATE
bundle install


1
2
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):

1
2
3
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。


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

1
sudo service postgresql restart

这里没有提到。


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

导航到该文件夹

1
cd /usr/LOCAL/var/postgres

检查postmaster.pid是否存在

1
ls

删除postmaster.pid

1
rm postmaster.pid


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

1
2
3
4
5
6
...
adapter: postgresql
encoding: unicode
pool: 5
host: localhost
port: 5432

这解决了我的问题:)

在我使用此修复之前:

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

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


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

1
2
sudo apt-GET remove postgresql
sudo apt-GET purge postgresql

现在运行:

1
apt-GET --purge remove postgresql\*

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

删除所有PostgreSQL包后,运行:

1
2
3
4
5
rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

你现在应该能够:

1
apt-GET install postgresql

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

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

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


你好世界:)对我来说最好但最奇怪的方法就是做下一件事。
1)下载postgres93.app或其他版本。将此应用添加到/ Applications /文件夹中。

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

1
export PATH=/Applications/Postgres93.app/Contents/MacOS/bin/:$PATH

它是从Postgres93.apppsql的路径。每次启动控制台时都会运行行(命令)。

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

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

5)此外,如果您想以图形方式查看数据库,则应安装PG Commander.app。将postgres数据库视为漂亮的数据表是一种很好的方式

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


1
gem uninstall pg

在OS X上使用Homebrew:

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


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

修复:unset DATABASE_URL

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


我尝试了解决这个问题的大多数解决方案,但无法解决问题。

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

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