PG :: ConnectionBad - не удалось подключиться к серверу: соединение отклонено

190

Каждый раз, когда я запускаю сервер rails 4.0, я получаю этот вывод.

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

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

Кто-нибудь может мне помочь?

  • 2
    попробуйте добавить 'host: localhost' в ваш файл database.yml, полученный от stackoverflow.com/a/10793186/919641
  • 1
    @trajan Я уже сделал это. Я даже использовал эту тему, когда впервые начал искать решение. Я разместил свой файл database.yml. Вы можете взглянуть на это. Может быть, это может помочь.
Показать ещё 9 комментариев
Теги:
database-connection
pg
rails-postgresql

23 ответа

437
Лучший ответ

Это может быть так же просто, как устаревший PID файл. Это может быть неудачно, потому что ваш компьютер полностью не завершил процесс останова, что означает, что postgres не удалил файл идентификатора PID (process id). Файл PID используется postgres, чтобы обеспечить одновременный запуск только одного экземпляра сервера. Поэтому, когда он запускается снова, он терпит неудачу, потому что уже есть файл PID, который сообщает postgres, что был запущен другой экземпляр сервера (хотя он не работает, он просто не смог завершить работу и удалить PID).

  • Чтобы исправить это, удалите/переименуйте файл PID. Найдите каталог данных postgres. На MAC с использованием homebrew это /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
  • Перезагрузите сервер. На mac с использованием launchctl (с помощью homebrew) следующие команды перезапускают сервер.

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

    ИЛИ в новых версиях Brew

    brew services restart postgresql
    
  • 23
    # 2 - отличное предложение: «Проверьте server.log». Моя ошибка была вызвана обновлением до Yosemite, журнал сервера сказал: FATAL: could not open directory "pg_tblspc": No such file or directory . Этот ответ помог мне с этой проблемой stackoverflow.com/questions/25970132/…
  • 18
    Я просто проголосовал за это, потому что он дал мне достаточно, чтобы решить проблему выжженной земли. Я удалил pg ( gem uninstall pg ), удалил postgres ( brew uninstall postgres ), а затем очистил папку postgres, в которой находилась куча устаревших rm -rf /usr/local/var/postgres ( rm -rf /usr/local/var/postgres ). После перезагрузки brew install postgres , ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents , launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist и ARCHFLAGS="-arch x86_64" gem install pg . Я не знаю, сколько других решений я пробовал, прежде чем заставить это работать.
Показать ещё 13 комментариев
31

Мне удалось решить проблему, выполнив ответ Криса Слейда, но для перезагрузки сервера мне пришлось использовать следующие команды

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

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

что я нашел здесь (ответ pjammer внизу внизу)

27

После большого поиска и анализа я нашел решение, если вы используете ubuntu, просто напишите эту команду в своем терминале и нажмите enter

sudo service postgresql restart

Это перезапустит PostgreSQL, надеюсь, что это будет полезно для вас.

  • 3
    Спасибо 1000 раз. Я только что обновил свою версию Ubuntu, и это исправлено для меня.
  • 0
    Несмотря на то, что этот вопрос относится к OSX Mavericks, это решение удобно для установок Ubuntu, когда происходит что-то странное в процессе миграции или запуска сервера.
23

Чтобы устранить эти проблемы с помощью Postgres и работать с Postgres на Mac OSX, это, вероятно, решение BEST и EASIEST, которое я нашел до сих пор:

http://postgresapp.com/

Просто скачайте, установите и будьте счастливы:)

21

У вас установлен postgresql в вашей системе? Если нет, то смотрите Установить postgresql. После успешной интеграции postgresql в вашу систему вы можете ввести что-то вроде этого в системном терминале:

which psql
#=> /usr/bin/psql

После этого вам нужно создать пользователя и базу данных в postgresql следующим образом:

sudo su - postgres
psql

Затем вы можете увидеть следующее в своем терминале

postgres=#

Введите там:

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. Вероятно, вам нужно что-то подобное:

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

  • 1
    Я установил его, но он находится в / usr / local / bin / psql, и когда я запускаю sudo -u postgres, он говорит sudo: unknown user: postgres
  • 0
    psql должен работать, если вы хотите использовать pg в своем приложении. Попробуйте набрать в терминале psql metall-directory_development. Какие-либо результаты? Если нет, то попробуйте переустановить postgres попробуйте это например
Показать ещё 1 комментарий
10
  • Удалить pg...

    gem uninstall pg
  • Удалить postgres...

    brew uninstall postgres
  • Загрузите папку postgres, которая может задерживаться кучей устаревшего материала в...

    rm -rf /usr/local/var/postgres
  • Перезагрузите (возможно, не нужно)

  • Переустановите pg...

    brew install postgres
  • Мой комментарий в ответ Криса Слейда начинается с жесткого пути, теперь я использую службы brew, которые упростили мою жизнь по-разному...

    brew install services
  • ... и запустите pg с ним...

    brew services start postgresql
  • Установите жемчужину...

    gem install pg

И bobsyouruncle.

  • 3
    Будьте осторожны с этим методом ... это подход выжженной земли, и он, скорее всего, уничтожит любые локальные базы данных, которые у вас есть. Загляните на github.com/copiousfreetime/launchy, где вы могли бы сделать lunchy stop postgres после lunchy start postgres после lunchy start postgres
9

проверьте файл postgresql.conf (на ubuntu находится в /etc/postgresql/ XX/main/postgresql.conf) и найдите строку, которая говорит

listen_addresses="localhost"

попробуйте изменить его на

listen_addresses="*"

он будет принимать все IP-адреса, затем проверит строку, в которой говорится

port=5432

и проверьте, является ли тот же порт вашего database.yml, по умолчанию на моем postgresql-9.2 используйте 5433 вместо 5432, не забудьте перезапустите сервер postgres, удачи

  • 0
    Это была и моя проблема. Я подозреваю, что это произошло, потому что у меня уже была запущена 9.3, когда я пытался «обновить» (т.е. установить 9.5). Я предполагаю, что он пытался быть вежливым и настраивать себя на параллельную работу на другом порту, а не брать на себя существующую установку / процесс.
6

Эта проблема возникает, когда postgres не закрывается должным образом. Вот как я разрешил эту проблему тремя простыми шагами.

Шаг 1: Перейдите в каталог postgres

Пользователи Mac найдут это в /usr/local/var/postgres, другие могут посмотреть /usr/var/postgres/.

Шаг 2: Удалите файл .pid, выполнив эту команду.

rm postmaster.pid

Шаг 3: Перезагрузите сервер

Пользователи Mac

brew services restart postgresql

Пользователи Linux

sudo service postgresql restart

Наконец, перезапустите приложение, и вам будет хорошо.

  • 0
    Круто, это было то, что исправило это для меня. Я попробовал некоторые другие ответы, но ключом был rm postmaster.pid . Спасибо!
  • 0
    Рады! Это помогло тебе
6

Как описано @Magne, ошибка PG::ConnectionBad - could not connect to server: Connection refused может быть представлена ​​после майора/младшая версия (например, 9.5 -> 9.6 или 9 -> 10) PostgreSQL.

Я получил эту ошибку после запуска brew upgrade postgresql после выпуска PostgreSQL версии 9.6. Проблема в том, что для обновления основной/младшей версии требуется дополнительные шаги для переноса старой даты в новую версию.

Как проверить, является ли это вашей проблемой

Вы можете проверить, если это проблема, проверив последнюю версию версии brew PostgreSQL, установленную с помощью homebrew...

$ 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_VERSION

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

Если PG_VERSION меньше, чем последняя формула brew, и разница заключается в изменении основной/младшей версии, то это, вероятно, ваша проблема.

Как исправить (например, как обновить данные)

Ниже приведены инструкции по обновлению с 9,5 до 9,6. Измените номера версий, соответствующие вашему собственному обновлению

Шаг 1. Убедитесь, что PostgreSQL отключен:

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

Шаг 2. Создайте новую нетронутую базу данных:

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

Шаг 3. Проверьте, какие старые и новые двоичные версии:

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

Обратите внимание, что в этом примере я обновляю от 9.5.4 двоичного до 9.6.1 двоичного

Шаг 4. Перенесите текущие данные в новую базу данных с помощью утилиты pg_upgrade.

$ 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. Переместите старый каталог данных с пути

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

Шаг 6. Переместите вновь созданный каталог данных туда, где PostgreSQL ожидает, что он будет

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

Шаг 7. Запустите PostgreSQL снова

$ 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 для Rails, вы должны перекомпилировать, удалив и переустановив драгоценный камень (пропустите этот шаг, если вы не используете жемчуг pg)

$ gem uninstall pg
$ gem install pg

Шаг 9. (необязательно) После того, как вы убедились, что все работает нормально, вы можете запустить восстановление дискового пространства с помощью следующей команды:

brew cleanup postgresql

... и если вы чувствуете себя очень храбрым, вы можете удалить старый каталог данных PostgreSQL со следующей командой

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

(Этот ответ основан на отличном сообщении в блоге https://keita.blog/2016/01/09/homebrew-and-postgresql-9-5/ с некоторыми дополнениями)

  • 1
    Это была именно та проблема, с которой я столкнулся. Это решение сработало отлично. Спасибо.
  • 0
    Это было решение для меня среди многих других во время этого комментария.
6

Как было сказано выше, я только что открыл приложение Postgres на своем Mac, нажал Open Psql, закрыл окно psql, перезапустил мой сервер rails в моем терминале, и он снова работал, больше не было ошибок.

Доверяйте слону: http://postgresapp.com/

4

поместите "host: localhost" в файл database.yml и запустите эту команду: rake db: create db: migrate

3

Найдите файл postgres, который может находиться в /usr/local/var/postgres/ или /usr/var/postgres/, а затем удалите файл postmaster.pid, присутствующий в этой папке.

3

Если вы столкнулись с этой проблемой после выполнения brew upgrade, который обновил postgres до новой основной версии (f.ex 9.3.0 до 9.4.0 или выше), сделайте следующее:

@dmitrygusev fix из https://github.com/Homebrew/homebrew/issues/35240

Следующее официальное руководство по миграции [Postgresql] помогло:

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

Это все. Проверьте правильность импорта, затем удалите резервные копии:

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

Проблема заключается в том, что при обновлении версии postgres для основной версии необходимо повторно создать/перенести вашу базу данных. И, возможно, chown каталогов или вручную вызовите initdb.

См. также: Как обновить PostgreSQL с версии 9.5 до версии 9.6 без потери данных?


Некоторые другие советы, которые могут пригодиться, если вы не используете Homebrew:

Как остановить 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

2

Я просто набрал sudo service postgresql restart и все снова работало.

1

У меня была та же проблема. Я проверяю последнюю строку файлов журнала PostgreSQL в /var/log/postgresql. В файле "/etc/postgresql/9.5/main/postgresql.conf" был установлен нераспознанный параметр конфигурации. Комментирование строки ошибки в postgresql.conf разрешило мою проблему.

1

Я знаю, что это поздно, но может помочь кому-то. У меня была такая же проблема. Оказывается, у меня были две версии postgres 9.1 и 9.5. Я удалил 9.1 и 9.5 и снова установил 9.5, и это сработало для меня.

1

У меня была такая же проблема в производстве (разработка все работала), в моем случае сервер БД не на том же компьютере, что и приложение, поэтому, наконец, все, что работало, это просто выполнить миграцию, написав:

bundle exec rake db:migrate RAILS_ENV=production

а затем перезагрузите сервер, и все сработало.

1

Моя проблема была в моем файле application.yml. Моя база данных url на heroku не использовала порт 5342. Проверьте свою конфигурацию heroku var DATABASE_URL. Убедитесь, что совпадения в точности совпали с вашим application.yml для соответствующей базы данных.

1

Это был определенно ответ Криса Слейда, который помог мне.

Я написал немного script, чтобы убить оставшиеся процессы, если полезно:

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
}
1

У меня была та же проблема, это объяснение разрешило это для меня: http://blog.55minutes.com/2013/09/postgresql-93-brew-upgrade/

ключевой шаг смотрел на хвост моего /usr/local/var/postgres/server.log, который позволил мне посмотреть, какова реальная проблема, а именно, что я не полностью завершил процесс обновления postgres

  • 0
    Подобная ситуация здесь - ключом для меня также было посмотреть на server.log . Нашел мой ответ здесь: stackoverflow.com/questions/25970132/…
0

Я столкнулся с этой ошибкой после следующего brew upgrade, в котором была обновлена ​​postgresql. Я нашел, как исправить мою проблему с этой большой должности. Я смог восстановить и запустить postgres и даже переместился по всем моим существующим базам данных. https://coderwall.com/p/ti4amw/how-to-launch-postgresql-after-upgrade

0

Я остановил сервер rails, запустил rake db:migrate и начал мой rails s.

0

Возможно, вы перезапустили свой компьютер и забыли запустить приложение Postgres.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню