2

私の Rails アプリ (v 3.2.8) では、これまでのところ、移行を問題なく使用しています。

DB として 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)

奇妙なことに、この 2 行を Rails アプリから完全に削除すると、移行が機能します。したがって、TCP接続とリッスンに問題がある場合、移行自体はどのように機能しますか(ただし、これら2つを再度オンにするとすぐには機能しません)

  1. application.rb - config.active_record.schema_format = :sql
  2. 私の移行ファイルの1つ- t.hstore :attributes
4

3 に答える 3

5

ほとんどの場合、PostgreSQL インスタンスは、少なくとも localhost で TCP/IP をリッスンしないように構成されています。

postgresql.confチェックインlisten_addressesドキュメントを参照してください。ほとんどの場合、 ''(空の文字列) に設定されているため、サーバーは UNIX ドメイン ソケットのみをリッスンします。

psqlなどは、pg_dumpデフォルトでローカル UNIX ドメイン ソケットに接続するため、Pg が TCP/IP をリッスンしていなくても機能します。Ruby pggem は、 etc でlibpq使用されるのと同じクライアント ライブラリのラッパーでpsqlあり、接続パラメータが明示的に指定されていない限り、デフォルトで UNIX ドメイン ソケットを使用します。

ただし、Rails は明示的な IP アドレスを渡しているpg_dumpように見えます。これにより、Pg がリッスンしていないように見える TCP/IP 経由で接続しようとし、観測された「接続拒否」エラーが発生します。

または、PostgreSQL がデフォルトで 5432 以外のポートにコンパイルされている可能性があります。同じ設定が libpq のデフォルトとしてコンパイルされているため、新しいポートに自動的に接続されます。ただし、Rails が実行時に明示的なポートを指定するpg_dumpと、組み込みのデフォルトに優先してそれが使用されます。portのディレクティブを確認してくださいpostgresql.conf。コメントアウトされていないか、これに設定されていない場合5432は、おそらくあなたの問題です。ディレクティブは、上記portにリンクされている同じページに記載されています。

ところで、Pg の実行中にpostgresql.confrunを見つけるには。psql template1 -c "SHOW config_file;"

于 2012-11-01T04:21:39.327 に答える
1

根本的な原因は、ローカル ループバック インターフェイスで接続をフィルタリングすることをお勧めするサード パーティのファイアウォール パッケージであることが判明しました。

コメント スレッドを参照してください。

于 2012-11-01T05:37:52.520 に答える
0

pg_dumpコマンドラインからUNIXドメインソケットを使用してPostgreSQLにアクセスしますが、railsツールはローカルホストへのTCP接続を作成しようとします。

pg_hba.conf(私にとってこれは/ var / lib / pgsql / data /にあります)を見て、次のような行があることを確認します。md5はパスワード認証が使用されることを意味します。

host    all         all         127.0.0.1/32          md5

(実稼働環境で実行する場合は、これを完全に理解してください!)

-h localhostpg_dumpの実行時にコマンドラインで明示的に指定することにより、TCP経由の接続をテストできます。pg_hba.confに変更を加えた場合は、忘れずにPostgreSQLを再起動してください。

于 2012-11-01T03:21:57.583 に答える