2012-11-01 46 views
2

在我的Rails应用程序(v 3.2.8)中,到目前为止,我已经使用迁移没有问题。pg_dump:“无法连接到服务器”在Rails“schema_format =:sql”迁移

我使用PostgreSQL 9.2作为数据库。我调整了我的application.rb以使用sql而不是模式自卸车(未注释config.active_record.schema_format = :sql)。

在那之后,我开始对移民这个错误:

$ rake db:migrate 

    [ALL MIGRATION STUFF IS PRINTED HERE] 

    pg_dump: [archiver (db)] connection to database "my_dev_db" failed: 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? 
    rake aborted! 
    Error dumping database 

I tried manually on the command line(logged in as the same user on my Mac) 

<!-- language: lang-sh --> 

    $ pg_dump my_dev_db > /tmp/db.sql 

No problems with that...happily dumps into `/tmp/db.sql` 

Why is rails having trouble with `pg_dump`? (I am on Mac OSX Lion) 

=========== 

Adding more diagnosis information 

=========== 

    $tail -10 /usr/local/var/postgres9.2/pg_hba.conf 

    local all    all          md5 
    # IPv4 local connections: 
    host all    all    127.0.0.1/32   md5 
    # IPv6 local connections: 
    host all    all    ::1/128     md5 
    # Allow replication connections from localhost, by a user with the 
    # replication privilege. 
    #local replication  rogert        trust 
    #host replication  rogert  127.0.0.1/32   trust 
    #host replication  rogert  ::1/128     trust 


    $ sudo lsof -p 62444 | awk '$5 == "unix" && $NF ~ /\// { print $NF }' 
    /tmp/.s.PGSQL.5432 

    $ ps auxw | grep post 
    postgres  1403 0.0 0.0 2435492 640 s007 S+ 21Oct12 0:00.05 bash 
    root   1401 0.0 0.0 2498096 128 s007 S 21Oct12 0:00.02 su postgres 
    rogert 62517 0.0 0.0 2426700 388 s001 R+ 9:21PM 0:00.00 grep post 
    rogert 62448 0.0 0.0 2481656 500 ?? Ss 8:46PM 0:00.03 postgres: wal writer process  
    rogert 62447 0.0 0.0 2481656 752 ?? Ss 8:46PM 0:00.07 postgres: writer process  
    rogert 62446 0.0 0.0 2481656 1040 ?? Ss 8:46PM 0:00.00 postgres: checkpointer process  
    rogert 62444 0.0 0.1 2481656 5368 s001 S  8:46PM 0:00.02 /usr/local/Cellar/postgresql/9.2.1/bin/postgres -D /usr/local/var/postgres9.2 


    $ rake db:migrate --trace 

    [ALL MIGRATION STUFF IS PRINTED HERE] 

    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/activerecord-3.2.8/lib/active_record/railties/databases.rake:393:in `block (3 levels) in <top (required)>' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain' 
    /Users/rogert/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/activerecord-3.2.8/lib/active_record/railties/databases.rake:162:in `block (2 levels) in <top (required)>' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute' 
    /Users/rogert/.rvm/gems/[email protected]_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain' 
    /Users/rogert/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 

$sudo vi /usr/local/var/postgres9.2/postgresql.conf 

[search for listen address] 

# - Connection Settings - 

listen_addresses = 'localhost'   # what IP address(es) to listen on; 
             # comma-separated list of addresses; 
             # defaults to 'localhost'; use '*' for all 
             # (change requires restart) 
port = 5432        # (change requires restart) 
max_connections = 100     # (change requires restart) 

请告诉我奇怪的是,如果我完全从我的Rails应用程序中删除这两条线路,迁移工作。所以,如果它与TCP连接和listenting的一个问题,是如何工作的移民本身(但不会当我把这两再次打开)

  1. application.rb中 - config.active_record.schema_format =: SQL
  2. 在我的移民文件中的一个 - t.hstore:属性
+0

你没有测试同样的事情;正如@Tom所指出的那样,'pg_dump'默认使用unix域套接字,而不是TCP/IP。尝试运行'pg_dump -h 127.0.0.1 -p 5432 my_dev_Db>/tmp/db.sql'。它运行正常吗? –

+1

在Mac OS X上,使用'sudo lsof -i -P | grep -i“listen”'列出侦听的TCP/IP端口。在你的情况下,你对'sudo lsof -i -P |感兴趣grep -i“listen”| grep postgres或者'sudo lsof -i -P | grep -i“listen”| grep 5432'。 –

回答

5

您的PostgreSQL实例最有可能配置为不侦听TCP/IP,至少在本地主机上。

postgresql.conf检查listen_addresses。见the documentation。它最有可能设置为''(空字符串),因此服务器只能在UNIX域套接字上侦听。

psql,pg_dump等将仍然工作,如果Pg没有监听TCP/IP,因为他们默认连接到本地unix域套接字。 Ruby pg gem是一个围绕libpq的包装,与psql等使用的客户端库相同,它也默认使用unix域套接字,除非明确指定连接参数。

但是,Rails似乎将一个明确的IP地址传递给pg_dump--导致它尝试通过TCP/IP进行连接,看起来Pg没有在监听,导致观察到“连接被拒绝”错误。

或者,可能PostgreSQL被编译为默认的端口而不是5432.相同的设置被编译为默认的libpq,所以它会自动连接到新的端口。但是,如果Rails在尝试运行时指定一个明确的端口pg_dump,它将优先使用内置的默认端口。检查postgresql.conf中的port指令;如果是不是注释掉或设置为5432这可能是你的问题。port指令记录在与上面链接的相同页面中。

BTW,到PG时运行定位postgresql.conf运行psql template1 -c "SHOW config_file;"

+0

$ psql template1 -c“SHOW config_file;” CONFIG_FILE -------------------------------------------- /USR /local/var/postgres9.2/postgresql.conf (1 row) – sat

+0

此外,运行lsof监听端口,显示我postgres正在监听5432. [[postgres 62706 rogert 5u IPv6 0xffffff8013361800 0t0 TCP localhost:5432(LISTEN) postgres 62706 rogert 6u IPv4 0xffffff801bd08880 0t0 TCP localhost:5432(LISTEN) postgres 62706 rogert 7u IPv6 0xffffff8013361bc0 0t0 TCP localhost:5432(LISTEN)]] – sat

+0

@BVSat OK ...这是您需要查看的文件。我没有发布它,因为*我*需要的信息,但因为我认为*你*可能;我经常看到人们不知道如何找到'postgresql.conf'的问题。 –

0

pg_dump在命令行中会使用UNIX域套接字,而轨道工具试图建立一个TCP连接到本地主机要访问的PostgreSQL 。

看看你的pg_hba.conf(对我来说这是在/ var/lib/pgsql/data /中)并检查是否有这样一行,其中md5表示将使用密码认证:

host all   all   127.0.0.1/32   md5 

(请确保您完全理解这一点,如果你要在生产环境中运行它!)

您可以测试运行pg_dump的时候在命令行上明确指定-h localhost通过TCP连接。如果对pg_hba.conf进行了任何更改,请记住重新启动PostgreSQL。

+0

似乎没有工作。奇怪。首先,我不知道rails如何连接以及如何连接pg_dump。如果我用-h localhost选项使用pg_dump,则会得到相同的错误。这样就完全排除了轨道。但我的问题仍然存在。到目前为止,这是我所看到的(见我原来的职位额外dignosis) – sat

+0

如果它是一个'pg_hba.conf'问题,该错误会从PG服务器的报告,有没有'的pg_hba.conf'进入用户/数据库/主机组合。这是一个“拒绝连接”,所以问题是服务器没有收听。第一个和最后一个参数是正确的,但是'pg_hba.conf'建议在这里不适用。 –

+0

增加了更多的诊断信息 - 仍然是相同的错误。我更改后重新启动服务器 – sat

1

的根本原因竟然是该以为本地回环接口过滤连接是一个好主意第三方防火墙软件包。

the comments thread