65

Я только что переустановил postgres через brew install postgres

Я запустил initdb /usr/local/var/postgres -E utf8 но получил это:

The files belonging to this database system will be owned by user "atal421".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default text search configuration will be set to "english".

initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".

Итак, я rm -rf папку postgres и запустил ее снова:

 initdb /usr/local/var/postgres -E utf8

он сказал, что все в порядке:

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

Итак, я выполнил эту команду и получил:

postgres -D /usr/local/var/postgres


FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 13731) running in data directory "/usr/local/var/postgres"?

Теперь, когда я смотрю на монитор активности, я вижу 6 случаев пост-прогресса.

Как это исправить?

7 ответов7

96

Объявление о государственной службе: никогда не удаляйте postmaster.pid . В самом деле. Отличный способ получить повреждение данных.

У вас уже был установлен PostgreSQL, и вы удалили каталог с данными, не останавливая работающий сервер. Таким образом, теперь у вас есть несколько потерянных серверных процессов PostgreSQL, которые управляют удаленными файлами данных, поэтому они больше не доступны в файловой системе и будут полностью удалены после закрытия последнего дескриптора открытого файла для них. Вы не можете использовать pg_ctl для выключения сервера, как обычно, потому что вы удалили кластерный datadir, поэтому вы должны просто убить процессы. Убейте почтмейстера (не используйте kill -9 , подойдет обычное kill), а остальные тоже отключатся.

После этого вы сможете запустить новый сервер в datadir для новых данных initdb .

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

В двух словах:

cat /usr/local/var/postgres/postmaster.pid

Запишите номер в первой строке, который является pid почтмейстера.

Проверьте с помощью ps что pid принадлежит postgres postmaster.

Завершите процесс postmaster с помощью следующей команды, заменив 'PID' на номер, который вы записали. Опять же, не используйте kill -9 или kill -KILL , просто используйте обычное kill , то есть SIGTERM:

kill PID

Если pid не относится к postgres postmaster, вручную kill все postgres которые все еще могут работать, убедитесь, что они больше не работают, и только затем удалите postmaster.pid . (Вы также должны убедиться, что postmaster.pid не находится в общем хранилище, где сервер мог работать на другой виртуальной машине / хосте).

42

Другая возможность состоит в том, что у вас было жесткое завершение работы, и процесс postgres умер, не очистив свой pid-файл. Это происходит со мной, когда батарея моего ноутбука умирает.

Это решение не для производственной системы, и вы должны убедиться, что демон postgres не запущен, но я использую свой ноутбук для кодирования и не беспокоюсь о необходимости регенерации моих баз данных.

Поэтому, если на этом порту запущен другой процесс - или его вообще нет, просто удалите файл pid, например

rm /usr/local/var/postgres/postmaster.pid

и Postgres скоро начнется нормально.

Чтобы узнать, запущен ли другой процесс на этом порту, вы можете сделать

ps wax | grep `head -1 /usr/local/var/postgres/postmaster.pid`

Тогда беги

tail -f /usr/local/var/postgres/server.log 

чтобы увидеть, сработало ли это. Тебе следует увидеть

FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
LOG:  database system was interrupted; last known up at 2014-05-25 09:41:32 PDT
LOG:  database system was not properly shut down; automatic recovery in progress

(или, по крайней мере, это то, что я только что увидел после того, как сделал выше :-))

(И действительно, разве Postgres не должен быть достаточно умным, чтобы понять, что с PID 933 не существует процесса и самостоятельно удалить фиктивный pid-файл?)

8

Я пытался все это безрезультатно после обновления до Yosemite сломал мой postgres (установленный через homebrew).

Тогда я наткнулся на этот пост в блоге: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres

Сначала мне нужно было создать недостающие каталоги, которые, очевидно, были стерты во время обновления (спасибо Apple!).

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

Затем просто запустите postgres снова, используя обычную последовательность запуска homebrew:

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

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

Спасибо Ruckus Notes за помощь в решении моей проблемы. Надеюсь, это поможет и вам.

4

Жесткие инструкции по перезагрузке

У меня была такая же проблема после полной перезагрузки. После проверки pid файла postmaster.pid я заметил, что у меня не запущен процесс. Я не хотел жестко удалять файл .pid, вместо этого я использовал псевдоним pg-stop который я создал в своем .bash_profile . этот псевдоним просто работает

pg_ctl -D /usr/local/var/postgres stop -s -m fast

Для справки

# psql
alias pg-start='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start'
alias pg-stop='pg_ctl -D /usr/local/var/postgres stop -s -m fast'

вывод журнала после pg-stop

LOG:  database system was interrupted; last known up at 2016-04-25 10:51:08 PDT
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/274FA10
LOG:  redo is not required
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
LOG:  database system was shut down at 2016-04-25 13:11:04 PDT

заваривать

Я подумал, что должен также упомянуть, что если вы установили postgres с homebrew, вы должны посмотреть на brew services . Вот теперь я предпочитаю запускать / останавливать свои базы данных.

XXXXX:~ chris$ brew services list
Name       Status  User  Plist
mongodb    stopped
postgresql started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
redis      started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.redis.plist
1

Иногда смиренный pg_ctl -w restart может помочь :-)

1

Я получил эту ошибку после того, как, я думаю, мой компьютер сломался. PostgreSQL не мог даже запуститься из-за этой ошибки, поэтому уничтожение процесса не было решением. Я просто сделал резервную копию и затем удалил файл postmaster.pid а затем ошибка прекратилась, и PG смог начать снова.

0

Удаление postmaster.pid на самом деле очень неплохо делать при каждой загрузке, вслепую. Это то, что делает моя система. Поскольку вы только что загрузились, вы знаете, что процесс Postgres не запущен, и если вы восстанавливаетесь после нечистого завершения работы, этот файл будет препятствовать вашему восстановлению.

Лучшим дизайном для Postgres было бы поместить файл postmaster.pid в файловую систему /run, чтобы он гарантированно удалялся при каждой перезагрузке. Многие другие серверы работают таким образом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .