pg_dump:Rails "schema_format = :sql"迁移中的"could not connect to server"



在我的Rails App(v 3.2.8)中,到目前为止,我使用了毫无问题的迁移。

我将PostgreSQL 9.2用作DB。我对application.rb进行了调整以使用SQL代替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)

很奇怪的是,如果我完全从铁轨应用程序中删除了这两条线,则迁移有效。因此,如果这是TCP连接和上述内容的问题,那么迁移本身如何工作(但我再次重新打开这两个迁移)

  1. 应用
  2. 在我的一个迁移文件中 - t.hstore:属性

很可能您的postgresql实例是不在tcp/ip上收听的,至少在localhost上。

postgresql.conf中检查listen_addresses。请参阅文档。最有可能将其设置为''(空字符串),因此服务器仅在Unix域插座上听。

psqlpg_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;"

根本原因是第三方防火墙软件包,认为在本地环回接口上过滤连接是一个好主意。

请参阅评论线程。

pg_dump从命令行中使用Unix-domain套接字访问PostgreSQL,而Rails工具正在尝试创建与LocalHost的TCP连接。

请查看您的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。

相关内容

  • 没有找到相关文章

最新更新