Saya menggunakan postgres dari homebrew di saya OS X, tapi ketika saya reboot sistem saya, kadang-kadang postgres tidak dimulai setelah reboot, dan jadi saya secara manual mencoba untuk memulai dengan postgres -D /usr/local/var/postgres
, tapi kemudian terjadi kesalahan dengan pesan berikut: FATAL: could not open directory "pg_tblspc": No such file or directory
.
Terakhir kali hal itu terjadi, saya tidak bisa mendapatkannya ke keadaan semula, jadi saya memutuskan untuk menghapus seluruh sistem postgres dan menginstalnya kembali dan membuat pengguna, tabel, kumpulan data, dll. Itu sangat menjijikkan, tetapi itu sering terjadi pada sistem saya, katakan sekali dalam beberapa bulan.
Jadi mengapa sering kehilangan pg_tblspc
file? Dan adakah yang bisa saya lakukan untuk menghindari hilangnya file?
Saya belum memutakhirkan homebrew dan postgres saya ke versi terbaru (yaitu saya telah menggunakan versi yang sama). Juga, semua hal yang saya lakukan pada database postgres adalah menghapus tabel dan mengisi data baru setiap hari. Saya belum mengubah pengguna, kata sandi, dll ...
EDIT (mbannert): Saya merasa perlu menambahkan ini, karena utas adalah hit teratas di google untuk masalah ini dan bagi banyak gejalanya berbeda. Homebrewer kemungkinan akan menemukan pesan kesalahan ini:
No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Jadi, jika Anda baru saja mengalami ini setelah pemutakhiran Yosemite, Anda sekarang sudah bisa membaca utas ini.
sumber
pg_tblspc
adalah direktori . Satu-satunya cara saya dapat melihat direktori ini dan hanya direktori ini menghilang secara acak adalah korupsi filesystem atau pemindai virus yang sangat buruk atau alat sinkronisasi file.tablespaces
itu, jadi saya pikir saya tidak menyimpannya di penyimpanan eksternal.pg_tblspc
tidak hilang begitu saja pada sistem apa pun yang pernah saya temui, saya juga tidak bisa membayangkan alasan yang masuk akal. Akan sangat sulit untuk mengatakan apa yang membuat sistem Anda berbeda tanpa lebih banyak detail.Jawaban:
Dipecahkan ... sebagian.
Tampaknya, Menginstal versi terbaru OS X (mis. Yosemite atau El Capitan) menghapus beberapa direktori di
/usr/local/var/postgres
.Untuk memperbaikinya, Anda cukup membuat ulang direktori yang hilang:
Atau, lebih ringkas ( terima kasih kepada Nate ):
Menjalankan kembali
pg_ctl start -D /usr/local/var/postgres
sekarang memulai server secara normal dan, setidaknya bagi saya, tanpa kehilangan data.MEMPERBARUI
Di sistem saya, beberapa direktori itu kosong bahkan ketika Postgres berjalan. Mungkin, sebagai bagian dari beberapa operasi "pembersihan", Yosemite menghapus direktori kosong? Dalam kasus apa pun, saya melanjutkan dan membuat file '.keep' di setiap direktori untuk mencegah penghapusan di masa mendatang.
Catatan : Membuat
.keep
file di direktori tersebut akan membuat beberapa noise di logfile Anda, tetapi tampaknya tidak mempengaruhi hal lain secara negatif.sumber
mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/
dantouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Jawaban Donavan tepat, saya hanya ingin menambahkan bahwa ketika saya melakukan hal yang berbeda dengan database (misalnya
rake db:test
), ia pergi mencari direktori berbeda yang belum disebutkan di atas dan akan tersedak ketika mereka tidak ada, di kasing sayapg_logical/mappings
, jadi Anda mungkin ingin mengatur terminal yang sedang berjalan:dan tontonlah folder yang hilang saat Anda melakukan aktivitas basis data Anda.
sumber
Ini sedikit di luar topik tapi perlu dicatat di sini sebagai bagian dari proses pemulihan PostgreSQL Yosemite. Saya memiliki masalah yang sama seperti di atas DAN saya memiliki masalah dengan PostgreSQL "sepertinya" berjalan di latar belakang sehingga bahkan setelah menambahkan direktori saya tidak bisa memulai kembali. Saya mencoba menggunakan
pg_ctl stop -m fast
untuk membunuh server PostgreSQL tetapi tidak berhasil. Saya juga mencoba pergi setelah proses langsung dengankill PID
tetapi segera setelah saya melakukan proses PostgreSQL muncul kembali dengan PID yang berbeda.Kunci akhirnya menjadi
.plist
file yang dimuat Homebrew ... Perbaikan untuk saya akhirnya menjadi:Setelah itu saya dapat memulai PostgreSQL secara normal.
sumber
launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
tetapi pada dasarnya itu juga masalah yang sama bagi saya, dan solusi yang sama.Direktori yang hilang harus ada di direktori data PostgreSQL Anda. Direktori data default adalah
/usr/local/var/postgres/
. Jika Anda telah mengatur direktori data yang berbeda, Anda perlu membuat kembali direktori yang hilang di sana. Jika Anda memodifikasi.plist
file yang disarankan oleh homebrew yang memulai PostgreSQL, Anda dapat menemukan direktori data di sana:(itu adalah
-D
opsi yang Anda mulai dengan postgres :)Pada contoh di atas, Anda akan membuat direktori yang hilang
/usr/local/pgsql/data
, seperti:sumber
Membuat direktori yang hilang tentu berhasil tetapi saya memperbaikinya dengan menginisialisasi ulang postgres db, ini adalah pendekatan yang lebih bersih untuk menghindari masalah di masa depan.
CATATAN: Pendekatan ini akan menghapus basis data yang ada
sumber