pg_dump:在Rails"schema_format =:sql"迁移中"无法连接到服务器"

sat*_*sat 2 postgresql ruby-on-rails rails-migrations

在我的rails app(v 3.2.8)中,到目前为止,我已经使用了迁移而没有任何问题.

我使用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/ruby-1.9.3-p194@rails_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/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_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/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_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/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_3.2.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
    /Users/rogert/.rvm/gems/ruby-1.9.3-p194@rails_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)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我从rails应用程序中完全删除这两行,迁移就可以了.因此,如果TCP连接存在问题并且存在,那么迁移本身是如何工作的(但是一旦我再次打开这两个就不会这样)

  1. application.rb - config.active_record.schema_format =:sql
  2. 在我的一个迁移文件中--t.hstore:attributes

Cra*_*ger 5

很可能你的PostgreSQL实例配置为不监听TCP/IP,至少在localhost上.

postgresql.conf检查中listen_addresses.请参阅文档.最有可能将其设置为''(空字符串),因此服务器仅侦听UNIX域套接字.

psql,pg_dump等等,因为它们默认连接到本地的Unix域套接字仍然可以工作,如果PG没有在TCP/IP监听.Ruby pggem是一个包装器libpq,是psqletc 使用的相同客户端库,它还默认使用unix域套接字,除非明确指定了连接参数.

但是,Rails似乎正在传递一个显式的IP地址pg_dump- 导致它尝试通过TCP/IP进行连接,它看起来Pg没有监听,导致观察到"连接被拒绝"错误.

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

顺便说一句,在Pg postgresql.conf运行psql template1 -c "SHOW config_file;"时定位运行.