关于rails上的ruby:PG :: ConnectionBad – 无法连接到服务器:连接被拒绝

PG::ConnectionBad - could not connect to server: Connection refused

每次运行Rails4.0服务器时,都会得到这个输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Started GET"/" for 127.0.0.1 at 2013-11-06 23:56:36 -0500

PG::ConnectionBad - could not connect to server: Connection refused
Is the server running on host"localhost" (::1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host"localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host"localhost" (fe80::1) and accepting
TCP/IP connections on port 5432?
:
 activerecord (4.0.0) lib/active_record/connection_adapters/postgresql_adapter.rb:825:in `connect'
 activerecord (4.0.0) lib/active_record/connection_adapters/postgresql_adapter.rb:542:in `
initialize'
 activerecord (4.0.0) lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `postgresql_connection'

 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:440:in `new_connection'
 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:450:in `
checkout_new_connection'
 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:421:in `acquire_connection'

 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:356:in `block in checkout'
 /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/monitor.rb:211:in `
mon_synchronize'
 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:355:in `checkout'

 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:265:in `block in connection'
 /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/monitor.rb:211:in `
mon_synchronize'
 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:264:in `connection'

 activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:546:in `retrieve_connection'
 activerecord (4.0.0) lib/active_record/connection_handling.rb:79:in `
retrieve_connection'
 activerecord (4.0.0) lib/active_record/connection_handling.rb:53:in `connection'

 activerecord (4.0.0) lib/active_record/migration.rb:792:in `current_version'
 activerecord (4.0.0) lib/active_record/migration.rb:800:in `
needs_migration?'
 activerecord (4.0.0) lib/active_record/migration.rb:379:in `check_pending!'

 activerecord (4.0.0) lib/active_record/migration.rb:366:in `call'
 actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:29:in `
block in call'
 activesupport (4.0.0) lib/active_support/callbacks.rb:373:in `_run__1613334440513032208__call__callbacks'

 activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks'
 actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:27:in `
call'
 actionpack (4.0.0) lib/action_dispatch/middleware/reloader.rb:64:in `call'

 actionpack (4.0.0) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
 better_errors (0.9.0) lib/better_errors/middleware.rb:84:in `
protected_app_call'
 better_errors (0.9.0) lib/better_errors/middleware.rb:79:in `better_errors_call'

 better_errors (0.9.0) lib/better_errors/middleware.rb:56:in `call'
 actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `
call'
 actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'

 railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app'
 railties (4.0.0) lib/rails/rack/logger.rb:21:in `
block in call'
 activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged'

 activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged'
 activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `
tagged'
 railties (4.0.0) lib/rails/rack/logger.rb:21:in `call'

 quiet_assets (1.0.2) lib/quiet_assets.rb:18:in `call_with_quiet_assets'
 actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `
call'
 rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'

 rack (1.5.2) lib/rack/runtime.rb:17:in `call'
 activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:in `
call'
 rack (1.5.2) lib/rack/lock.rb:17:in `call'

 actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call'
 railties (4.0.0) lib/rails/engine.rb:511:in `
call'
 railties (4.0.0) lib/rails/application.rb:97:in `call'

 rack (1.5.2) lib/rack/content_length.rb:14:in `call'
 thin (1.5.1) lib/thin/connection.rb:81:in `
block in pre_process'
 thin (1.5.1) lib/thin/connection.rb:79:in `pre_process'

 thin (1.5.1) lib/thin/connection.rb:54:in `process'
 thin (1.5.1) lib/thin/connection.rb:39:in `
receive_data'
 eventmachine (1.0.3) lib/eventmachine.rb:187:in `run'

 thin (1.5.1) lib/thin/backends/base.rb:63:in `start'
 thin (1.5.1) lib/thin/server.rb:159:in `
start'
 rack (1.5.2) lib/rack/handler/thin.rb:16:in `run'

 rack (1.5.2) lib/rack/server.rb:264:in `start'
 railties (4.0.0) lib/rails/commands/server.rb:84:in `
start'
 railties (4.0.0) lib/rails/commands.rb:78:in `block in <top (required)>'

 railties (4.0.0) lib/rails/commands.rb:73:in `<top (required)>'
 bin/rails:4:in `
<main>'

我在运行Mavericks OS X 10.9,所以我不知道这是不是问题所在。我已经尽力了,但似乎什么都没用。我已经多次卸载和安装Postgres和PG GEM。

这是我的database.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
development:
  adapter: postgresql
  encoding: unicode
  database: metals-directory_development
  pool: 5
  username:
  password:
  template: template0
  host: localhost
  port: 5432

test: &test
  adapter: postgresql
  encoding: unicode
  database: metals-directory_test
  pool: 5
  username:
  password:
  template: template0
  host: localhost
  port: 5432

staging:
  adapter: postgresql
  encoding: unicode
  database: metals-directory_production
  pool: 5
  username:
  password:
  template: template0
  host: localhost

production:
  adapter: postgresql
  encoding: unicode
  database: metals-directory_production
  pool: 5
  username:
  password:
  template: template0
  host: localhost

cucumber:
  <<: *test

有人能帮我吗?


它可以像一个过时的PID文件一样简单。它可能会无声地失败,因为您的计算机没有完全完成关闭过程,这意味着Postgres没有删除PID(进程ID)文件。

Postgres使用PID文件来确保一次只运行服务器的一个实例。所以当它再次启动时,会失败,因为已经有一个pid文件告诉postgres服务器的另一个实例已经启动(即使它没有运行,它也不会关闭并删除pid)。

  • 要修复它,请删除/重命名pid文件。找到Postgres数据目录。在使用自制的Mac上,它是/usr/local/var/postgres/,其他系统可能是/usr/var/postgres/
  • 要确保这是问题所在,请查看日志文件(server.log)。在最后一行,您将看到:
  • FATAL: lock file"postmaster.pid" already exists
    HINT: Is another postmaster (PID 347) running in data directory"/usr/local/var/postgres"?

  • 如果是这样,rm postmaster.pid
  • 重新启动服务器。在使用launchctl(和homebrew)的Mac上,以下命令将重新启动服务器。

    1
    2
    launchctl unload homebrew.mxcl.postgresql.plist  
    launchctl load -w homebrew.mxcl.postgresql.plist

    或在较新版本的BREW上

    1
    brew services restart postgresql

  • 经过大量的搜索和分析,我找到了一个解决方案,如果您使用Ubuntu,只需在您的终端中编写这个命令,然后点击Enter。

    1
    sudo service postgresql restart

    这将重新启动你的PostgreSQL,希望它能帮你砍头。


    我已经按照ChrisSlade的回答解决了这个问题,但是要重新启动服务器,我必须使用以下命令:

    1
    2
    3
    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

    我在这里找到的(Pjammer的答案在下面)


    当Postgres不能正常关闭时,就会出现这个问题。下面是我如何通过三个简单步骤解决这个问题。

    步骤1:转到Postgres目录

    Mac用户会在/usr/local/var/postgres中找到这个,其他人可能会看/usr/var/postgres/

    步骤2:通过运行此命令删除.pid文件。

    1
    rm postmaster.pid

    步骤3:重新启动服务器

    MAC用户

    1
    brew services restart postgresql

    Linux用户

    1
    sudo service postgresql restart

    最后重新启动你的应用程序,你就可以走了。


    您的系统中是否安装了PostgreSQL?如果没有,请观看Install PostgreSQL。成功地将PostgreSQL集成到系统中之后,可以在系统终端中键入类似的内容:

    1
    2
    which psql
    #=> /usr/bin/psql

    之后,您需要在PostgreSQL中创建一个用户和数据库,如下所示:

    1
    2
    sudo su - postgres
    psql

    然后您可以在终端中看到以下内容

    1
    postgres=#

    类型:

    1
    2
    3
    CREATE USER yourname WITH PASSWORD 'passwordhere';
    CREATE DATABASE metals-directory_production  WITH OWNER yourname;
    GRANT ALL PRIVILEGES ON DATABASE metals-directory_production TO yourname;

    这样做之后,您需要更正您的database.yml。也许你需要这样的东西:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    development:
      adapter: postgresql
      encoding: unicode
      database: metals-directory_development
      pool: 5
      username: yourname
      password: passwordhere   ### password you have specified within psql
      host: localhost
      port: 5432               ### you can configure it in file postgresql.conf

    另外,如果PostgreSQL有问题,最好检查pg_hba.conf


    为了解决Postgres的这类问题,并与Postgres在Mac OSX上合作,这可能是迄今为止我发现的最好和最简单的解决方案:

    网址:http://postgresapp.com/

    只需下载、安装并快乐:)


  • 卸载PG:

    1
    gem uninstall pg
  • 卸载Postgres:

    1
    brew uninstall postgres
  • 核弹Postgres文件夹,它可能会与一堆陈旧的东西在一起:

    1
    rm -rf /usr/local/var/postgres
  • 重新启动(可能不必要)

  • 重新安装PG:

    1
    brew install postgres
  • 我在ChrisSlade的回答中的评论开始了PG的艰难之路,现在我使用了BREW服务,它在很多方面简化了我的生活:

    1
    brew install services
  • 从pg开始:

    1
    brew services start postgresql
  • 重新安装宝石:

    1
    gem install pg
  • 还有你叔叔。


    检查文件postgresql.conf(在ubuntu上)是否在/etc/postgresql/x.x/main/postgresql.conf中,并查找以下行:

    1
    listen_addresses="localhost"

    尝试将其更改为:

    1
    listen_addresses="*"

    它将接受每一个IP,然后检查下面的行:

    1
    port=5432

    并检查是否与您的database.yml相同,在我的postgresql-9.2上默认使用5433而不是5432,不要忘记重启postgres服务器。

    祝你好运!


    如@magne所述,在PostgreSQL的主要/次要版本升级(如9.5 -> 9.69 -> 10之后,可以出现错误PG::ConnectionBad - could not connect to server: Connection refused

    我在PostgreSQL 9.6版发布后运行了brew upgrade postgresql之后得到了这个错误。问题是主要/次要版本升级需要其他步骤才能将旧日期迁移到新版本。

    如何检查这是否是您的问题

    您可以通过检查随自制程序安装的最新BREW Formula PostgreSQL版本来检查这是否是问题所在…

    1
    2
    3
    4
    5
    6
    $ brew info postgresql

    /usr/local/Cellar/postgresql/9.5.4_1 (3,147 files, 35M)
    Poured from bottle on 2016-10-14 at 13:33:28
    /usr/local/Cellar/postgresql/9.6.1 (3,242 files, 36.4M) *
    Poured from bottle on 2017-02-06 at 12:41:00

    …然后将其与当前的pg_版本进行比较

    1
    2
    $ cat /usr/local/var/postgres/PG_VERSION
    9.5

    如果pg_版本低于最新的BREW公式,并且差异是主要/次要版本更改,那么这可能是您的问题。

    如何修复(即如何升级数据)

    以下说明用于从9.5升级到9.6。根据您自己的升级更改版本号

    步骤1。确保PostgreSQL已关闭:

    1
    2
    3
    $ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
    # or, with Homebrew...
    $ brew services stop postgresql

    步骤2。创建新的原始数据库:

    1
    $ initdb /usr/local/var/postgres9.6 -E utf8

    步骤3。检查旧的和新的二进制版本是什么:

    1
    2
    $ ls /usr/local/Cellar/postgresql/
    9.5.3   9.5.4   9.6.1

    注意,在这个示例中,我将从9.5.4二进制升级到9.6.1二进制

    步骤4。使用pg_升级实用程序将当前数据迁移到新数据库。

    1
    2
    3
    4
    5
    6
    $ pg_upgrade \
      -d /usr/local/var/postgres \
      -D /usr/local/var/postgres9.6 \
      -b /usr/local/Cellar/postgresql/9.5.4/bin/ \
      -B /usr/local/Cellar/postgresql/9.6.1/bin/ \
      -v
    • -d标志指定当前数据目录
    • -d标志指定要创建的新数据目录
    • -b指定旧二进制
    • -b指定要升级到的新二进制文件

    步骤5。将旧数据目录移到一边

    1
    $ mv /usr/local/var/postgres /usr/local/var/postgres9.5

    步骤6。将新创建的数据目录移动到PostgreSQL期望的位置

    1
    $ mv /usr/local/var/postgres9.6 /usr/local/var/postgres

    步骤7。重新启动PostgreSQL

    1
    2
    3
    $ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
    # or, if you're running a current version of Homebrew
    $ brew services start postgresql

    步骤8。如果您使用pg gem for rails,那么应该通过卸载并重新安装gem来重新编译(如果您不使用pg gem,则跳过此步骤)。

    1
    2
    $ gem uninstall pg
    $ gem install pg

    步骤9。(可选)当您确信一切正常后,可以使用以下命令运行"重新获得一些磁盘空间":

    1
    brew cleanup postgresql

    …如果你真的很勇敢,你可以用下面的命令删除旧的PostgreSQL数据目录

    1
    rm -rf /usr/local/var/postgres9.5/

    (此答案基于一篇优秀的博客文章https://keita.blog/2016/01/09/homebrew-and-postgresql-9-5/,并添加了一些内容)


    如前所述,我刚刚打开了我的Mac上的Postgres应用程序,单击了打开Psql,关闭了Psql窗口,在我的终端重新启动了我的Rails服务器,它再次工作,没有任何错误。

    相信大象:http://postgresapp.com/


    这才是真正帮助我的。

    1
    2
    $ cd /usr/local/var/postgres/
    $ rm postmaster.pid

    参考文献:http://alumni.lewagon.org/questions/60


    如果您在执行将Postgres升级到新的主要版本(f.ex 9.3.09.4.0或更高版本)的brew upgrade后遇到此问题,请执行以下操作:

    @dmitrygusev's fix from https://github.com/Homebrew/homebrew/issues/35240

    Following official [Postgresql] migration guide helped:

    1
    2
    3
    4
    5
    6
    7
    brew switch postgres 9.3.5    # presuming you already installed 9.4.1
    pg_dumpall > outputfile
    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
    mv /usr/local/var/postgres /usr/local/var/postgres.old
    brew switch postgres 9.4.1
    initdb -D /usr/local/var/postgres
    psql -d postgres -f outputfile

    That's all. Check if import went well, then delete backups:

    1
    2
    rm outputfile
    rm -Rf /usr/local/var/postgres.old

    这里的问题是,在Postgres的主要版本升级中,需要重新创建/迁移数据库。可能还有chown目录或者手动调用initdb目录。

    另请参见:如何在不丢失数据的情况下将PostgreSQL从版本9.5升级到版本9.6?

    如果您不使用自制啤酒,还可以使用其他一些技巧:

    如何手动停止PG服务器:

    pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log stop

    如何手动启动PG服务器:

    pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start


    找到您的postgres文件,它可能在/usr/local/var/postgres//usr/var/postgres/中,然后删除该文件夹中的postmaster.pid文件。


    host: localhost放入database.yml文件,运行以下命令:

    1
    rake db:create db:migrate


    我在osx movaje上更新了mac之后也遇到了同样的问题。

    我找到了这个解决方案:

    首先尝试终端中的以下命令行:

    1
    brew services restart postgresql

    如果没有变化:

    1
    ps aux | grep postgres

    如果仍然没有变化:

    1
    ls -ls | grep post

    最后一个修复它的命令是,通过从根目录执行来删除postgres锁文件:

    1
    rm /usr/local/var/postgres/postmaster.pid

    然后:

    1
    brew services restart postgresql

    来自Berziiii:https://github.com/ga-wdi-boston/capstone-project/issues/325

    希望能有所帮助:)

    当做!!


    我也遇到了同样的问题,这个解释为我解决了这个问题:http://blog.55minutes.com/2013/09/postgresql-93-brew-upgrade/

    关键步骤是查看my/usr/local/var/postgres/server.log的尾部,这让我明白了真正的问题是什么,我还没有完全完成PostgreSQL的升级过程。


    肯定是克里斯·斯莱德的回答帮助了我。

    如果有用的话,我写了一个小脚本来终止剩下的进程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    kill_postgres() {
      if [[ $* -eq"" ]]; then
        echo"Usage: 'kill_postgres <db_name>' to kill remaining instances (Eg. 'kill_postgres my_app_development')"
      else
        gksudo echo"Granted sudo"
        pids="$(ps xa | grep postgres | grep $* | awk '{print $1}' | xargs)"
        if [[ $pids -eq"" ]]; then
          echo"Nothing to kill"
        else
          for pid in"${pids[@]}"
          do
            echo"Killing ${pid}"
            sudo kill $pid
            echo"Killed ${pid}"
          done
          kill_postgres $*
        fi
      fi
    }

    使用Postgres应用程序的Mac用户可能希望打开该应用程序(聚光灯搜索Postgres或在菜单栏中找到大象图标)。其中,您可能会看到一个带有消息"stale postmaster.pid file"的红色X。不幸的是,聚光灯搜索不会显示此文件的位置。单击"服务器设置…",然后在打开的对话框中,单击"显示"按钮打开数据目录。在中导航一个文件夹(对我来说是"var-10"),然后删除postmaster.pid文件。

    返回Postgres应用程序并单击开始按钮。那个红色的X应该变成一个绿色的复选标记,并显示"正在运行"。现在,您应该能够在终端中成功地运行像rails server这样的rails命令。

    Postgres App Server Settings - Show Data Directory


    我在生产方面也遇到了同样的问题(开发方面的每一件事都有效)。在我的例子中,DB服务器与应用程序不在同一台机器上,所以最后的工作就是通过编写以下内容进行迁移:

    1
    bundle exec rake db:migrate RAILS_ENV=production

    然后重启服务器,一切正常。


    我刚执行了这个命令一切又开始了。


    我也有同样的问题。我检查了/var/log/postgresqlPostgreSQL日志文件的最后一行。文件/etc/postgresql/9.5/main/postgresql.conf中有一个无法识别的配置参数,说明postgresql.conf中的错误行解决了我的问题。


    我知道这很晚了,但可能会对某人有所帮助。我也有同样的问题。结果发现我有两个版本的Postgres9.1和9.5。我卸载了9.1和9.5,再次安装了9.5,这对我很有用。


    你可能重新启动了电脑,忘记启动Postgres应用程序。


    我的问题出现在application.yml文件中。我在heroku上的数据库url没有使用端口5342。检查你的heroku配置var DATABASE_URL。确保与适用数据库的application.yml中的was完全匹配。


    我刚刚遇到了这个问题,所有建议的解决方案都不适合我。经过大量的谷歌搜索,我确实找到了一个解决方案。这就是我的工作。

    首先,我必须运行这个命令来启动服务器,我猜应该设置配置文件的位置。

    1
    pg_ctl -D /usr/local/var/postgres start && brew services start postgresql

    然后我运行这个命令来访问Postgres

    1
    psql postgres

    在postgres提示下,我输入了"du"来列出角色

    1
    postgres=# \du

    postgres角色丢失,所以我必须用这个命令创建它

    1
    CREATE ROLE POSTGRES WITH SUPERUSER CREATEDB CREATEUSER CREATEROLE REPLICATION BYPASSRLS ;

    这解决了我的问题,我希望这能帮助别人。


    在跟踪一个brew upgrade之后,我遇到了这个错误,其中postgresql被更新了。我从这篇伟大的文章中找到了解决问题的方法。我可以让Postgres备份并运行,甚至可以在我现有的所有数据库上迁移。https://coderwall.com/p/ti4amw/how-to-launch-postgresql-after-upgrade


    我停止了Rails服务器,运行rake db:migrate并启动了我的rails s


    您不必删除postmaster.pid文件,因为这可能会导致数据损坏。

    选择权?简单地说,kill这个过程(不要使用kill -9,只需要一个普通的杀戮就可以了)。

    然后重启Postgres服务器,你就可以走了!

    实现这一目标的步骤如下:

  • 找到并打开postmaster.pid文件(我的在mac塞拉)

    vi ~/Library/Application\ Support/Postgres/var-10/postmaster.pid

  • 复制pid-它是postmaster.pid文件第一行的编号

  • kill PID终止进程,例如,如果我的PID是381,我将执行kill 381
  • 重新启动postres-如果使用BREW,请执行brew services start postgresql。或者如果使用Postgresapp,只需单击start按钮