“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 -rfpostgres 폴더를 다시 실행했습니다.

 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은 다중 프로세스 아키텍처입니다.
Craig Ringer

답변:


104

공공 서비스 발표 : 절대 삭제하지 마십시오 postmaster.pid. 정말. 데이터 손상을 입을 수있는 좋은 방법입니다.

이미 PostgreSQL을 설치했으며 실행중인 서버를 중지하지 않고 데이터 디렉토리를 삭제했습니다. 따라서 삭제 된 데이터 파일을 관리하는 일부 고아 PostgreSQL 서버 프로세스가 있으므로 파일 시스템에서 더 이상 액세스 할 수 없으며 마지막으로 열린 파일 핸들이 닫히면 완전히 삭제됩니다. pg_ctlcluster datadir을 삭제 했으므로 서버를 정상적으로 종료하는 데 사용할 수 없으므로 프로세스를 종료해야합니다. 전자 메일 관리자를 죽여 (DO 없습니다 사용 kill -9평범한 살인 할 것) 나머지도 종료됩니다.

그런 다음 datadir에서 새로운 initdb'd 데이터 에 대해 새 서버를 시작할 수 있습니다 .

다른 이전 버전의 PostgreSQL을 제거하지 않으면 트랙에서 충돌이 발생할 가능성이 큽니다.

간단히 말해서 :

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

첫 번째 줄의 번호를 적어 두십시오 . 이것은 포스트 마스터 의 pid 입니다.

pspid가 postgres postmaster의 pid인지 확인하십시오 .

다음 명령으로 포스트 마스터 프로세스를 종료하고 'PID'를 적어 둔 번호로 바꾸십시오. 또, 사용하지 않는 kill -9또는 kill -KILL그냥 일반을 사용 kill, 즉SIGTERM :

kill PID

PID는 포스트 그레스 전자 메일 관리자, 수동의가 아닌 경우 kill어떤 postgres여전히 실행되고있는 백엔드를 확인하지 더 이상 실행되고 있음을 만 다음 제거는 postmaster.pid. 또한 postmaster.pid서버가 다른 VM / 호스트에서 실행될 수있는 공유 저장소에 없는지 확인해야합니다 .


이것은 나를 위해 일했다!

작동합니다. 휴지통을 비우는 데 문제가 있었으며 일부 데이터 파일이 아마도 거기에 있었을 것입니다 ... 어떻게했는지는 확실하지 않습니다. 이전 프로세스를 종료하면 정상적으로 작동합니다.
Dan L

네. 그 자리에 있었다.
Amos Folarin 2016 년

7
하드 크래시 후 PID 파일은 살아남을 수 있지만 프로세스는 종료됩니다. 이 경우 PID 파일의 PID는 Postgres와 관련이없는 프로세스를 가리킬 수 있습니다. 이 경우 두 번째 답변을 참조하십시오.
febeling

2
평원 kill PID은 나를 위해 작동하지 않았다. 나는 필요했다 kill -3 PID. 필자의 경우 프로세스를 올바르게 중지하지 않고 터미널 창을 종료했을 수있는 종료를 수행했습니다. 이 kill -3 PID과정에서 사망 한 과정과 그 자식들이 성공적으로 postgres를 다시 시작하게했습니다.
Paul Masri-Stone

46

또 다른 가능성은 하드 셧다운이 있고 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
이것은 나를위한 경우였습니다. postmaster.pid파일이 가리키는 것과 동일한 PID에서 우연히 다른 프로세스를 실행했습니다 . 불완전한 종료 (홈 브루를 통해 OSX에 Postgres의 랩탑 설치) 후 며칠이 지났습니다.
Jesse Buchanan

1
맥이 로그인 화면에 걸려서 전원을 꺼야했습니다. 결국 postmaster.pid 파일을 남겨두고 다음 재부팅시 다른 것에 사용 된 PID를 참조하면 postgres가 나타나지 않습니다. craig-ringer의 게시물과 같은 PID를 죽이려고했지만 도움이되지 않았습니다. 그러나 rm postmaster.pid나를 위해 일했습니다. 데이터 손상이 보이지 않습니다 (어쨌든 이것은 단지 개발 시스템입니다).
Steven Chanin 2016 년

저도 마찬가지입니다. 로컬 Rails 서버를 멈추지 않고 Mac을 종료했습니다.
Bruno Paulino 2016 년

1
pid 파일의 위치를 ​​기억할 수 없기 때문에 항상이 스레드로 돌아옵니다. 항상 찾아야합니다. : P
haslo

이것은 Postgres.app에서 나에게 일어났습니다. 삭제 후 ~/Library/Application Support/Postgres/data/postmaster.pid나는 다시 시작했다.
Rob Johansen

8

Yosemite로 업그레이드 한 후 내 집주인을 통해 설치 한 후이 모든 것을 시도했지만 아무 소용이 없었습니다.

그런 다음이 블로그 게시물에서 우연히 발견되었습니다 : 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}

그런 다음 일반적인 homebrew 실행 순서를 사용하여 postgres를 다시 시작하십시오.

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

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

문제 해결에 도움을 준 Ruckus Notes에게 감사드립니다. 잘하면 그것은 또한 당신을 도와줍니다.


4

하드 리 부트 지침

하드 재부팅 후 동일한 문제가 발생했습니다. postmaster.pid파일의 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

꾸미다

나는 또한 당신이 homebrew와 함께 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이 트릭을 할 수 있습니다 :-)


최고 답변이 DOOMED 일 때 사랑하십시오! 아무 것도 없습니다! 작은 명령 하나만으로 실행됩니다. (내 경우에는 pid in /usr/pgsql/9.3/data/postmaster.pid이 ps aux에 없었습니다.)
Noumenon

0

postmaster.pid를 삭제하는 것은 실제로는 매번 부팅 할 때마다 맹목적으로해야 할 일입니다. 그것이 내 시스템이하는 일입니다. 방금 부팅했기 때문에 Postgres 프로세스가 실행 중이 아니며, 부정한 종료에서 복구하는 경우이 파일이 복구를 방해합니다.

Postgres의 더 나은 디자인은 postmaster.pid 파일을 / run 파일 시스템에 넣는 것이므로 재부팅 할 때마다 삭제되는 것이 보장됩니다. 다른 많은 서버들도 그렇게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.