Вот моя исходная ошибка:
$ 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 обнаружит, что процесс больше не существует, и удалит сам файл, но понятно, что я не слишком много экспериментировал с этим! Может это зависит от версии.