Я только что переустановил 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 - это многопроцессная архитектура.Ответы:
Объявление о государственной службе: никогда не удаляйте
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
сервер не находится в общем хранилище, где сервер мог работать на другой виртуальной машине / хосте).источник
kill PID
не работает для меня. Я нуждалсяkill -3 PID
. В моем случае я сделал выключение, которое могло убить окна терминала, не останавливая процессы должным образом.kill -3 PID
Убил процесс и его дети успешно позволили мне начать Postgres снова.Другая возможность заключается в том, что у вас было жесткое завершение работы, и процесс postgres умер, не очистив свой pid-файл. Это происходит со мной, когда батарея моего ноутбука умирает.
Это решение не для производственной системы, и вы должны убедиться, что демон postgres не запущен , но я использую свой ноутбук для кодирования и не беспокоюсь о необходимости регенерации моих баз данных.
Поэтому, если на этом порту запущен другой процесс - или его вообще нет, просто удалите файл pid, например
и Postgres скоро начнется нормально.
Чтобы узнать, запущен ли другой процесс на этом порту, вы можете сделать
Тогда беги
чтобы увидеть, сработало ли это. Тебе следует увидеть
(или, по крайней мере, это то, что я только что увидел после того, как я сделал выше :-))
(И действительно, разве Postgres не должен быть достаточно умным, чтобы понять, что с PID 933 не существует процесса и самостоятельно удалить фиктивный pid-файл?)
источник
postmaster.pid
который указывал файл. Это было через несколько дней после нечистого выключения (установка Postgres на OSX на ноутбуке через homebrew).rm postmaster.pid
работал на меня. Я не вижу никакого повреждения данных (но в любом случае, это просто машина для разработки).~/Library/Application Support/Postgres/data/postmaster.pid
я снова заработал.Я пытался все это безрезультатно после обновления до Yosemite сломал мой postgres (установленный через homebrew).
Тогда я наткнулся на этот пост в блоге: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres
Сначала мне нужно было создать недостающие каталоги, которые, очевидно, были стерты во время обновления (спасибо Apple!).
Затем просто запустите postgres снова, используя обычную последовательность запуска homebrew:
Спасибо Ruckus Notes за помощь в решении моей проблемы. Надеюсь, это поможет и вам.
источник
Жесткие инструкции по перезагрузке
У меня была такая же проблема после полной перезагрузки. После проверки
postmaster.pid
pid файла я заметил, что у меня нет запущенного процесса. Я не хотел сильно удалять файл .pid, вместо этого я использовалpg-stop
псевдоним, который я создал в своем.bash_profile
. этот псевдоним просто работаетpg_ctl -D /usr/local/var/postgres stop -s -m fast
Для справки
вывод журнала после
pg-stop
заваривать
Я подумал, что должен также упомянуть здесь, что если вы установили postgres с homebrew, вам стоит
brew services
взглянуть. Вот теперь я предпочитаю запускать / останавливать свои базы данных.источник
Я получил эту ошибку после того, как, я думаю, мой компьютер сломался. PostgreSQL не мог даже запуститься из-за этой ошибки, поэтому уничтожение процесса не было решением. Я просто сделал резервную копию и затем удалил
postmaster.pid
файл, а затем ошибка прекратилась, и PG смог начать снова.источник
Иногда смиренный
pg_ctl -w restart
может добиться цели :-)источник
/usr/pgsql/9.3/data/postmaster.pid
не присутствовал в ps aux.)Удаление postmaster.pid на самом деле очень прилично делать при каждой загрузке, вслепую. Это то, что делает моя система. Поскольку вы только что загрузились, вы знаете, что процесс Postgres не запущен, и если вы восстанавливаетесь после нечистого завершения работы, этот файл будет препятствовать вашему восстановлению.
Лучшим дизайном для Postgres было бы поместить файл postmaster.pid в файловую систему / run, чтобы он гарантированно удалялся при каждой перезагрузке. Многие другие серверы работают таким образом.
источник