"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 - це багатопроцесова архітектура.
Крейг Рінгер

Відповіді:


104

Оголошення громадської служби: ніколи не видаляйте postmaster.pid. Дійсно. Чудовий спосіб отримати корупцію даних.

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

Тоді ви зможете запустити новий сервер у datadir проти свіжого initdbданих.

З великою ймовірністю у вас виникнуть конфлікти вниз по трасі, якщо ви не видалите іншу стару версію PostgreSQL.

Коротко:

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

Запишіть номер у першому рядку, який є підпискою пошти.

Переконайтеся, psщо pid - це поштовий менеджер postgres.

Убийте процес поштового керування за допомогою наступної команди, замінивши "PID" на номер, який ви зазначили. Знову ж таки, не використовуйте kill -9або kill -KILLпросто використовуйте звичайну kill, тобтоSIGTERM :

kill PID

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


це працювало для мене!
Тон

Це працює. У мене виникла проблема, коли я спорожняв сміття, і, здається, деякі файли даних, ймовірно, були там… Не знаю як, але вони були. Одного разу я вбив старий процес, він справно працював.
Дан Л

так. це було місце.
Амос Фоларін

7
Слід зазначити, що після важкої аварії файл PID може вижити, поки процес загине. У цьому випадку PID у файлі PID може вказувати на процес, який не має нічого спільного з Postgres. Дивіться другу відповідь на цей випадок.
підступність

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

46

Інша можливість полягає в тому, що у вас відбулося жорстке завершення роботи, і процес постгресу загинув, не очищаючи його pid-файл. Це трапляється зі мною, коли батарея мого ноутбука вмирає.

Це рішення не для виробничої системи, і ви дійсно повинні переконатися, що демон не працює , але я використовую свій ноутбук для кодування, і я не переживаю за необхідність відновлення моїх баз даних.

Отже, якщо на цьому порту працює інший процес - або його взагалі немає, просто видаліть файл pid, наприклад

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

і постгреси незабаром почнуть чудово.

Щоб дізнатися, чи працює інший процес на цьому порту, ви можете зробити

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 через домашню програму).
Джессі Бюкенан

1
Мій мак висів на екрані входу, і мені довелося вимкнути його. Це в результаті залишило файл 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 зламало мою постгрес (встановлену через 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 знову, використовуючи звичайну послідовність запуску домашньої програми:

$ 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 з домашньою мовою, ви повинні 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

Інформація про заварі була саме тим, що мені потрібно, дякую!
dnatoli

1

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


1

Іноді скромні pg_ctl -w restartможуть зробити трюк :-)


Любіть, коли найвища відповідь - ВИ ВДАЛИ! ТОЧУ НІЧОГО! і тоді одна маленька команда змушує мене бігати. (У моєму випадку pid /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.