Saya baru saja menginstal ulang postgres via brew install postgres
Saya berlari initdb /usr/local/var/postgres -E utf8
tetapi 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 -rf
folder 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?
postgres
dengan postmaster dan lima backend utilitas. PostgreSQL adalah arsitektur multi-proses.Jawaban:
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_ctl
untuk mematikan server seperti biasa karena Anda telah menghapus cluster datadir, jadi Anda harus mematikan prosesnya. Membunuh kepala kantor pos (jangan tidak menggunakankill -9
, hanya membunuh biasa akan melakukan) dan sisanya akan ditutup juga.Anda kemudian dapat memulai server baru di datadir terhadap
initdb
data 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
ps
bahwa pid itu milik postmaster postgres.Bunuh proses postmaster dengan perintah berikut, ganti 'PID' dengan nomor yang telah Anda catat. Sekali lagi, jangan gunakan
kill -9
ataukill -KILL
, cukup gunakan datarankill
, yaituSIGTERM
:kill PID
Jika pid bukan milik postmaster postgres, secara manual
kill
setiappostgres
backend yang mungkin masih berjalan, verifikasi bahwa mereka tidak lagi berjalan, dan baru kemudian hapuspostmaster.pid
. (Anda juga harus memverifikasi bahwapostmaster.pid
ini bukan pada penyimpanan bersama di mana server dapat berjalan pada beberapa VM / host lain).sumber
kill PID
tidak bekerja untuk saya. Saya butuhkankill -3 PID
. Dalam kasus saya, saya telah melakukan shutdown yang mungkin telah membunuh windows terminal tanpa menghentikan proses dengan benar. Proseskill -3 PID
membunuh dan anak-anaknya berhasil membiarkan saya memulai postgres lagi.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
dan postgres akan segera dimulai dengan baik.
Untuk mengetahui apakah proses lain berjalan pada port itu, Anda bisa melakukannya
Lalu lari
untuk melihat apakah itu berhasil. Anda harus melihat
(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?)
sumber
postmaster.pid
file yang ditunjuk. Ini beberapa hari setelah shutdown yang tidak bersih (instalasi laptop Postgres pada OSX via homebrew).rm postmaster.pid
berhasil untuk saya. Saya tidak melihat adanya kerusakan data (tetapi bagaimanapun juga, ini hanyalah mesin pengembangan)~/Library/Application Support/Postgres/data/postmaster.pid
saya berdiri dan berlari lagi.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!).
Kemudian jalankan postgres lagi menggunakan urutan peluncuran homebrew normal:
Terima kasih Ruckus Notes untuk membantu menyelesaikan masalah saya. Semoga ini membantu Anda juga.
sumber
PETUNJUK REBOOT KERAS
Saya memiliki masalah yang sama setelah reboot keras. Setelah memeriksa
postmaster.pid
pid file, saya perhatikan saya tidak memiliki proses yang berjalan. Saya tidak ingin menghapus file .pid dengan susah payah, sebaliknya saya menggunakanpg-stop
alias yang saya buat di blog saya.bash_profile
. alias ini hanya berjalanpg_ctl -D /usr/local/var/postgres stop -s -m fast
Sebagai referensi
log output setelahnya
pg-stop
buatan
Saya pikir saya juga harus menyebutkan di sini bahwa jika Anda telah menginstal postgres dengan homebrew, Anda harus
brew services
melihatnya. Sekarang saya lebih suka memulai / menghentikan basis data saya.sumber
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.pid
file dan kemudian kesalahan berhenti dan PG dapat memulai lagi.sumber
Terkadang yang sederhana
pg_ctl -w restart
dapat melakukan trik :-)sumber
/usr/pgsql/9.3/data/postmaster.pid
tidak hadir dalam ps aux.)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.
sumber