"FATAL: file kunci" postmaster.pid "sudah ada"

68

Saya baru saja menginstal ulang postgres via brew install postgres

Saya berlari initdb /usr/local/var/postgres -E utf8tetapi mendapatkan ini:

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

jadi, saya rm -rffolder postgres dan jalankan lagi:

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

katanya semuanya baik-baik saja:

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

jadi, saya menjalankan perintah itu dan mendapat:

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

Sekarang ketika saya melihat Monitor Aktivitas saya, saya bisa melihat 6 contoh postgress.

Bagaimana cara saya memperbaikinya?

AdamT
sumber
Anda mungkin melihat satu contoh postgresdengan postmaster dan lima backend utilitas. PostgreSQL adalah arsitektur multi-proses.
Craig Ringer

Jawaban:

104

Pengumuman layanan publik: tidak pernah dihapus postmaster.pid. Benarkah. Cara hebat untuk mendapatkan korupsi data.

Anda sudah menginstal PostgreSQL, dan Anda menghapus dir data tanpa menghentikan server yang berjalan. Jadi sekarang Anda memiliki beberapa proses server PostgreSQL yatim yang mengelola file data yang telah dihapus, sehingga mereka tidak lagi dapat diakses dalam sistem file dan akan sepenuhnya dihapus ketika pegangan file terbuka terakhir untuk mereka ditutup. Anda tidak dapat menggunakan pg_ctluntuk mematikan server seperti biasa karena Anda telah menghapus cluster datadir, jadi Anda harus mematikan prosesnya. Membunuh kepala kantor pos (jangan tidak menggunakan kill -9, hanya membunuh biasa akan melakukan) dan sisanya akan ditutup juga.

Anda kemudian dapat memulai server baru di datadir terhadap initdbdata yang baru.

Sangat mungkin bahwa Anda akan mengalami konflik di jalur kecuali Anda menghapus versi lama PostgreSQL lainnya.

Pendeknya:

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

Catat nomor pada baris pertama, yang merupakan pid dari kepala kantor pos.

Pastikan psbahwa pid itu milik postmaster postgres.

Bunuh proses postmaster dengan perintah berikut, ganti 'PID' dengan nomor yang telah Anda catat. Sekali lagi, jangan gunakan kill -9atau kill -KILL, cukup gunakan dataran kill, yaituSIGTERM :

kill PID

Jika pid bukan milik postmaster postgres, secara manual killsetiap postgresbackend yang mungkin masih berjalan, verifikasi bahwa mereka tidak lagi berjalan, dan baru kemudian hapus postmaster.pid. (Anda juga harus memverifikasi bahwa postmaster.pidini bukan pada penyimpanan bersama di mana server dapat berjalan pada beberapa VM / host lain).

Craig Ringer
sumber
ini berhasil untuk saya!
Nada
Ini bekerja. Punya masalah di mana saya mengosongkan sampah saya dan tampaknya beberapa file data mungkin ada di sana ... tidak yakin bagaimana, tetapi mereka. Setelah saya membunuh proses lama itu bekerja dengan baik.
Dan L
ya. itu tepat.
Amos Folarin
7
Harus disebutkan bahwa setelah hard crash file PID mungkin bertahan, sementara prosesnya mati. Dalam hal ini PID dalam file PID dapat menunjuk ke suatu proses yang tidak ada hubungannya dengan Postgres. Lihat jawaban kedua untuk kasus itu.
febeling
2
Dataran kill PIDtidak bekerja untuk saya. Saya butuhkan kill -3 PID. Dalam kasus saya, saya telah melakukan shutdown yang mungkin telah membunuh windows terminal tanpa menghentikan proses dengan benar. Proses kill -3 PIDmembunuh dan anak-anaknya berhasil membiarkan saya memulai postgres lagi.
Paul Masri-Stone
46

Kemungkinan lain adalah Anda mengalami shutdown yang sulit dan proses postgres mati tanpa membersihkan file pidnya. Ini terjadi pada saya ketika baterai laptop saya mati.

Solusi ini bukan untuk sistem produksi, dan Anda harus benar-benar memastikan daemon postgres tidak berjalan , tetapi saya menggunakan laptop saya untuk pengkodean dan saya tidak khawatir perlu meregenerasi basis data saya.

Jadi jika proses lain - atau tidak sama sekali - berjalan di port itu, cukup hapus file pid, misalnya

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

dan postgres akan segera dimulai dengan baik.

Untuk mengetahui apakah proses lain berjalan pada port itu, Anda bisa melakukannya

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

Lalu lari

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

untuk melihat apakah itu berhasil. Anda harus melihat

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

(atau setidaknya itulah yang baru saja saya lihat setelah saya melakukan hal di atas :-))

(Dan sungguh, bukankah Postgres harus cukup pintar untuk menyadari bahwa tidak ada proses dengan PID 933 dan menghapus file pid palsu sendiri?)

AlexChaffee
sumber
1
Inilah yang terjadi pada saya. Saya memiliki proses lain yang berjalan secara kebetulan pada PID yang sama dengan postmaster.pidfile yang ditunjuk. Ini beberapa hari setelah shutdown yang tidak bersih (instalasi laptop Postgres pada OSX via homebrew).
Jesse Buchanan
1
Mac saya menggantung di layar masuk dan saya harus mematikannya. Yang akhirnya meninggalkan file postmaster.pid di sekitar yang mereferensikan PID yang digunakan untuk sesuatu yang lain pada reboot berikutnya dan postgres tidak akan muncul. Saya mencoba membunuh PID (seperti yang disarankan oleh craig-ringer), tetapi itu tidak membantu. Namun, rm postmaster.pidberhasil untuk saya. Saya tidak melihat adanya kerusakan data (tetapi bagaimanapun juga, ini hanyalah mesin pengembangan)
Steven Chanin
Hal yang sama bagi saya. Saya telah mematikan mac saya tanpa menghentikan server Rails lokal.
Bruno Paulino
1
Saya terus kembali ke utas ini setiap kali ini terjadi - karena saya tidak pernah ingat di mana file pid itu, jadi saya selalu harus mencarinya: P
haslo
Ini terjadi pada saya dengan Postgres.app. Setelah menghapus ~/Library/Application Support/Postgres/data/postmaster.pidsaya berdiri dan berlari lagi.
Rob Johansen
8

Saya mencoba semua ini tetapi tidak berhasil setelah memutakhirkan ke Yosemite memecahkan postgres saya (diinstal melalui homebrew).

Kemudian saya menemukan posting blog ini: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres

Pertama-tama saya perlu membuat direktori yang hilang yang ternyata terhapus selama upgrade (terima kasih Apple!).

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

Kemudian jalankan postgres lagi menggunakan urutan peluncuran homebrew normal:

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

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

Terima kasih Ruckus Notes untuk membantu menyelesaikan masalah saya. Semoga ini membantu Anda juga.

Billy G
sumber
4

PETUNJUK REBOOT KERAS

Saya memiliki masalah yang sama setelah reboot keras. Setelah memeriksa postmaster.pidpid file, saya perhatikan saya tidak memiliki proses yang berjalan. Saya tidak ingin menghapus file .pid dengan susah payah, sebaliknya saya menggunakan pg-stopalias yang saya buat di blog saya .bash_profile. alias ini hanya berjalan

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

Sebagai referensi

# 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 output setelahnya 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

buatan

Saya pikir saya juga harus menyebutkan di sini bahwa jika Anda telah menginstal postgres dengan homebrew, Anda harus brew servicesmelihatnya. Sekarang saya lebih suka memulai / menghentikan basis data saya.

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
Chris Miller
sumber
Info minuman hanyalah yang saya butuhkan, terima kasih!
dnatoli
1

Saya menerima kesalahan ini setelah, saya pikir, komputer saya mogok. PostgreSQL bahkan tidak dapat memulai karena kesalahan ini sehingga mematikan proses bukanlah solusi. Saya hanya membuat cadangan dan kemudian menghapus postmaster.pidfile dan kemudian kesalahan berhenti dan PG dapat memulai lagi.

Jeff
sumber
1

Terkadang yang sederhana pg_ctl -w restartdapat melakukan trik :-)

sekmo
sumber
Cintai ketika jawaban teratas adalah ANDA DILAKUKAN! SENTUH APA SAJA! dan kemudian satu perintah kecil membuat saya berjalan. (Dalam kasus saya pid di /usr/pgsql/9.3/data/postmaster.pidtidak hadir dalam ps aux.)
Noumenon
0

Menghapus postmaster.pid sebenarnya adalah hal yang sangat layak dilakukan pada setiap boot, secara membabi buta. Itulah yang dilakukan sistem saya. Karena Anda baru saja boot, Anda tahu tidak ada proses Postgres yang berjalan, dan jika Anda pulih dari shutdown yang tidak bersih, file ini akan ada di sana mencegah pemulihan Anda.

Desain yang lebih baik untuk Postgres adalah meletakkan file postmaster.pid di sistem file / run, sehingga dijamin akan dihapus pada setiap reboot. Banyak server lain yang bekerja seperti itu.

jerapah
sumber