Назад | Перейти на главную страницу

Postgres не закрывается должным образом

Вот моя исходная ошибка:

$ psql
psql: could not connect to server: No such file or directory
  Is the server running locally and accepting
  connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

и в Rails ...

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?

Я поискал и нашел около дюжины ответов на этот вопрос. Основная проблема в том, что когда я выключаю свой компьютер, /usr/local/var/postgres/postmaster.pid не удаляется - подразумевается, что postgres не закрывается должным образом. Я читал, что вам НЕ следует удалять pid (как часто рекомендуется), а вместо этого убивать его, даже с kill -9 - но опять же, это временное решение и предполагает основную ошибку.

РЕДАКТИРОВАТЬ: я мог бы запустить cat /usr/local/var/postgres/postmaster.pid первая строка дает мне идентификатор процесса. Изначально я ошибся.

Когда я бегу tail -r /usr/local/var/postgres/server.log | less чтобы увидеть журнал сервера (наоборот), я получаю:

HINT:  Is another postmaster (PID 1167) running in data directory "/usr/local/var/postgres"?
FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 1167) running in data directory "/usr/local/var/postgres"?
FATAL:  lock file "postmaster.pid" already exists
LOG:  database system is shut down
LOG:  shutting down
LOG:  autovacuum launcher shutting down
LOG:  received smart shutdown request
LOG:  using stale statistics instead of current ones because stats collector is not responding
LOG:  using stale statistics instead of current ones because stats collector is not responding

...

LOG:  using stale statistics instead of current ones because stats collector is not responding
LOG:  using stale statistics instead of current ones because stats collector is not responding
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system was shut down at 2016-05-25 17:36:26 MDT
LOG:  database system is shut down
LOG:  shutting down
LOG:  autovacuum launcher shutting down
LOG:  received smart shutdown request

Похоже, что база данных закрывается правильно, но если бы это было так, я считаю, что postmaster.pid файл будет удален, как при запуске, например. brew services stop postgres.

Файл /usr/local/var/postgres/postmaster.pid сам по себе не является PID, это текстовый файл, содержащий PID. В данном случае это похоже на 1167. Попробуйте cat /usr/local/var/postgres/postmaster.pid. Файл существует, потому что по какой-то причине postgres был некорректно закрыт.

Если этот PID 1167 существует (ps -p $(cat /usr/local/var/postgres/postmaster.pid) должен работать, чтобы проверить), то удалять файл не следует. Если вы удалите файл во время работы postgres, а затем попытаетесь перезапустить postgres, вы, скорее всего, рискуете серьезно повредить базу данных.

Вы должны остановить процесс postgres любыми способами, включая kill -9 - но это последнее, только если необходимо. Начните с обычных команд, перейдите к kill и только если это не сработает kill -9.

Если (или если) у вас нет процесса с PID в файле, вы можете удалить файл.

На самом деле, я думал, что postgres обнаружит, что процесс больше не существует, и удалит сам файл, но понятно, что я не слишком много экспериментировал с этим! Может это зависит от версии.