“FATAL: Dosyayı kilitle” postmaster.pid “zaten var”


68

Postgres’leri yeni yükledim brew install postgres

Koştum initdb /usr/local/var/postgres -E utf8ama şunu aldım:

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".

öyleyse, ben rm -rfpostgres klasörü ve tekrar koştum:

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

her şeyin yolunda olduğunu söyledi:

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

öyleyse ben bu komutu koştum ve aldım:

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"?

Şimdi Aktivite İzleyicime baktığımda, 6 adet gecikme vakası görebiliyorum.

Bunu nasıl düzeltebilirim?


Muhtemelen bir postacı ve beş yardımcı program görevlisinin bir örneğini görüyorsunuz postgres. PostgreSQL çok işlemli bir mimaridir.
Craig Ringer

Yanıtlar:


104

Kamu hizmeti duyurusu: asla silme postmaster.pid. Gerçekten mi. Veri bozulmasını sağlamanın harika bir yolu.

Zaten PostgreSQL kurulmuştu ve çalışan sunucuyu durdurmadan veri dizinini sildiniz. Böylece artık silinen veri dosyalarını yöneten bazı PostgreSQL sunucu işlemlerine sahipsiniz, bu nedenle dosya sisteminde artık erişilebilir değiller ve onlara açılan son dosya tanıtıcısı kapalı olduğunda tamamen silinecekler. pg_ctlKümeyi datadir komutunu sildiğiniz için sunucuyu normal şekilde kapatmak için kullanamazsınız , bu nedenle işlemleri sonlandırmanız gerekir. Postmaster öldür (do not kullanmak kill -9sadece sıradan öldürmek yapacak) ve geri kalanı da kapatacak.

Daha sonra yeni initdbveriye karşı datadir içinde yeni bir sunucu başlatabileceksiniz .

PostgreSQL'in diğer eski sürümünü kaldırmadığınız sürece, izlerde çatışmalar yaşamanız olasıdır.

Kısaca:

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

Postmaster'ın borcu olan ilk satırdaki numarayı not edin.

psPid'in postgres postmasterına ait olduğunu doğrulayın .

Postmaster işlemini, 'PID' yerine not ettiğiniz sayı ile değiştirerek aşağıdaki komutu kullanın. Yine, kullanmayın kill -9ya da kill -KILLsadece bir düz kullanın kill, yaniSIGTERM :

kill PID

Pid bir postgres postmaster elle o değilse killherhangi postgreshala çalışıyor olabilir backendleri doğrulamak artık çalışan kurduğunuzu ancak o zaman kaldırın postmaster.pid. ( postmaster.pidSunucunun başka bir VM / ana bilgisayarda çalışabileceği paylaşılan depolamada olmadığını da doğrulamanız gerekir ).


bu benim için çalıştı!
Ton

Bu çalışıyor. Çöpümü boşalttığım bir sorun vardı ve muhtemelen bazı veri dosyalarının içeride olduğu sanılıyor ... nasıl olduğundan emin değillerdi, ama öyleydi. Eski süreci öldürdüğümde işe yaradı.
Dan L

Evet. o nokta oldu.
Amos Folarin

7
Sert bir kazadan sonra, PID dosyasının işlem devam ederken hayatta kalabileceği belirtilmelidir. Bu durumda, PID dosyasındaki PID, Postgres ile ilgisi olmayan bir işleme işaret edebilir. Bu dava için ikinci cevaba bakınız.
febeling

2
Bir ova kill PIDbenim için işe yaramadı. İhtiyacım vardı kill -3 PID. Benim durumumda işlemleri düzgün bir şekilde durdurmadan terminal pencerelerini öldürebilecek bir kapatma işlemi yapmıştım. kill -3 PIDSüreci öldürdü ve alt öğeleri başarıyla beni tekrar postgres başlatmak izin vermek.
Paul Masri-Stone

46

Başka bir olasılık da, sizin kapatmanız ve postgres işleminin pid dosyasını temizlemeden ölmesidir. Dizüstü bilgisayarımın pili bittiğinde bu bana olur.

Bu çözüm bir üretim sistemi için değildir ve postgres arka planının çalışmadığından emin olmalısınız , ancak dizüstü bilgisayarımı kodlama için kullanıyorum ve veritabanlarımı yeniden oluşturma gereği duymuyorum.

Bu yüzden başka bir işlem - ya da hiçbiri - bu bağlantı noktasında çalışıyorsa, sadece pid dosyasını silin.

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

ve postgres yakında başlayacak.

Bu bağlantı noktasında başka bir işlemin çalışıp çalışmadığını öğrenmek için

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

O zaman koş

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

işe yarayıp yaramadığını görmek için. Görmelisin

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

(ya da en azından yukarıdakileri yaptıktan sonra gördüğüm şey buydu :-))

(Ve gerçekten de Postgres, PID 933 ile bir işlem olmadığını fark etmek ve sahte pid dosyasını kendi başına kaldırmak için yeterince akıllı olmamalı mı?)


1
Bu benim için böyleydi. Tesadüfen postmaster.piddosya PID üzerinde çalışan başka bir işlem vardı dosya işaret etti. Bu, net olmayan bir kapanmadan birkaç gün sonraydı (Postgres'in OSX'e homebrew üzerinden dizüstü bilgisayar kurulumu).
Jesse Buchanan

1
Mac'im giriş ekranında asılıydı ve kapatmam gerekiyordu. Bu, bir sonraki yeniden başlatma işleminde başka bir şey için kullanılmış olan bir PID'ye başvuran postmaster.pid dosyasını bırakarak sona erdi. PID'i öldürmeye çalıştım (tavsiye edilen craig-ringer'ın yazdığı gibi), ancak bu işe yaramadı. Ancak, rm postmaster.pidbenim için çalıştı. Herhangi bir veri bozulması görmüyorum (ancak her durumda, bu sadece bir geliştirme makinesidir).
Steven Chanin

Benim için de aynı şey. Yerel Rails sunucusunu durdurmadan mac'umu kapatmıştım.
Bruno Paulino

1
Bu ne zaman olursa olsun bu konuya geri dönmeye devam ediyorum - çünkü pid dosyasının nerede olduğunu asla hatırlayamıyorum, bu yüzden her zaman aramak zorunda
kalıyorum

Bu bana Postgres.app ile oldu. Sildikten sonra ~/Library/Application Support/Postgres/data/postmaster.pidtekrar çalışıyordum.
Rob Johansen

8

Tüm bunları denedim boşuna Yosemite yükselttikten sonra benim postgres kırdı (homebrew aracılığıyla yüklü).

Sonra bu blog yazısına rastladım: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres

Öncelikle, yükseltme sırasında görünüşte silinmiş olan eksik dizinleri oluşturmam gerekiyordu (teşekkürler Apple!).

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

Sonra normal homebrew fırlatma dizisini kullanarak tekrar postgres başlatın:

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

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

Sorunumu çözmeye yardımcı olduğunuz için teşekkürler Ruckus Notlar. Umarım size de yardımcı olur.


4

SERT REBOOT TALİMATLARI

Sert bir yeniden başlatmadan sonra da aynı sorunu yaşadım. postmaster.pidDosyanın ücretini kontrol ettikten sonra , çalışan hiçbir işlemim olmadığını fark ettim. .Pid dosyasını silmek istemedim, bunun yerine kendimde pg-stopoluşturduğum bir diğer adı kullandım .bash_profile. bu takma ad çalışır

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

Referans için

# 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'

log çıkışı sonra 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

demlemek

Burada ayrıca belirtmeliyim ki, eğer homebrew ile postgres yerleştirdiyseniz, brew servicesbir göz atmanız gerekir . Artık veritabanlarımı başlatmayı / durdurmayı tercih ediyorum.

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

Demlemek sadece ihtiyacım olan şeydi, teşekkürler!
dnatoli

1

Sanırım, bilgisayarım düştüğünde bu hatayı aldım. PostgreSQL bu hata nedeniyle bile başlayamadı, bu yüzden süreci öldürmek çözüm değildi. Ben sadece yedeklenmiş ve sonra postmaster.piddosyayı sildim ve sonra hata durdu ve PG tekrar başlatabildi.


1

Bazen mütevazi pg_ctl -w restarthile yapabilir :-)


En iyi cevap SİZİN YAPILAN OLDUĞUNDAN sevgiler! DOKUNMASI HİÇBİR ŞEY! ve sonra küçük bir emir kaçmamı sağladı. (Benim durumumda pid /usr/pgsql/9.3/data/postmaster.pidps
ps'de

0

Postmaster.pid dosyasını silmek aslında her açılışta yapılacak en iyi şeydir. Sistemimin yaptığı şey bu. Yeni başlattığınız için çalışan hiçbir Postgres işlemi olmadığını biliyorsunuz ve kirli bir kapanmadan kurtulacaksanız, bu dosya kurtarmanızı önlüyor olacak.

Postgres için daha iyi bir tasarım postmaster.pid dosyasını / run dosya sistemine koymak olacaktır, bu nedenle her yeniden başlatmada silinmesi garantilenir. Diğer birçok sunucu bu şekilde çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.