«FATAL: заблокировать файл» postmaster.pid «уже существует»


68

Я только что переустановил 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 случаев пост-прогресса.

Как я могу это исправить?


Вы, вероятно, видите один экземпляр postgresс почтмейстером и пятью служебными бэкэндами. PostgreSQL - это многопроцессная архитектура.
Крейг Рингер

Ответы:


103

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

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

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

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

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

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

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

Убедитесь, psчто pid - это почтмейстер postgres.

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

kill PID

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


это сработало для меня!
Тон

Это работает. У меня была проблема, когда я опустошил свой мусор, и, кажется, там были некоторые файлы данных ... не знаю как, но они были. Как только я убил старый процесс, он работал нормально.
Дан Л

да уж. это было место на.
Амос Фоларин

7
Следует отметить, что после серьезного сбоя PID-файл может выжить, а процесс умирает. В этом случае PID в файле PID может указывать на процесс, который не имеет ничего общего с Postgres. Смотрите второй ответ для этого случая.
febeling

2
Равнина kill PIDне работает для меня. Я нуждался kill -3 PID. В моем случае я сделал выключение, которое могло убить окна терминала, не останавливая процессы должным образом. kill -3 PIDУбил процесс и его дети успешно позволили мне начать Postgres снова.
Пол Масри-Стоун

46

Другая возможность заключается в том, что у вас было жесткое завершение работы, и процесс 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-файл?)


1
Это был случай для меня. У меня был другой процесс, случайно запущенный на том же PID, на postmaster.pidкоторый указывал файл. Это было через несколько дней после нечистого выключения (установка Postgres на OSX на ноутбуке через homebrew).
Джесси Бьюкенен

1
Мой Mac завис на экране входа в систему, и мне пришлось выключить его. Это закончилось тем, что оставил файл postmaster.pid вокруг ссылки на PID, который использовался для чего-то другого при следующей перезагрузке, и postgres не появлялся. Я попытался убить PID (как рекомендованный пост Craig-Ringer), но это не помогло. Тем не менее, rm postmaster.pidработал на меня. Я не вижу никакого повреждения данных (но в любом случае, это просто машина для разработки).
Стивен Чанин

То же самое для меня. Я выключил свой Mac, не останавливая локальный сервер Rails.
Бруно Паулино

1
Я продолжаю возвращаться к этой теме всякий раз, когда это происходит - потому что я никогда не могу вспомнить, где находится файл pid, поэтому мне всегда приходится искать его: P
haslo

Это случилось со мной с Postgres.app. После удаления ~/Library/Application Support/Postgres/data/postmaster.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

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

У меня была такая же проблема после полной перезагрузки. После проверки postmaster.pidpid файла я заметил, что у меня нет запущенного процесса. Я не хотел сильно удалять файл .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

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


1

Иногда смиренный pg_ctl -w restartможет добиться цели :-)


Любовь, когда главный ответ - ТЫ ОБРЕЧЕНО! НИЧЕГО НЕ ПРИКАСАЙТЕСЬ! и тогда одна маленькая команда заставляет меня бежать. (В моем случае pid in /usr/pgsql/9.3/data/postmaster.pidне присутствовал в ps aux.)
Нумен

0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.