`pg_tblspc` hilang setelah instalasi versi terbaru OS X (Yosemite atau El Capitan)

464

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_tblspcfile? 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.

Blaszard
sumber
Eep, itu benar-benar tidak seharusnya! Ketika Anda mengatakan "versi terbaru", harap tunjukkan nomor versi yang tepat. Juga, sudahkah Anda menaruh tablespace pada penyimpanan eksternal? di mana direktori data PostgreSQL berada?
Craig Ringer
Juga, pg_tblspcadalah 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.
Craig Ringer
Saya tidak memiliki pemindai virus. Saya tidak tahu apa tablespacesitu, jadi saya pikir saya tidak menyimpannya di penyimpanan eksternal.
Blaszard
Hm Yang bisa saya katakan adalah ada sesuatu yang sangat salah. pg_tblspctidak 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.
Craig Ringer
2
Apakah Anda dapat menemukan solusi untuk @Gardecolo ini? Saya mengalami masalah yang sama setelah memutakhirkan ke Yosemite.
Donovan

Jawaban:

928

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:

mkdir /usr/local/var/postgres/pg_tblspc
mkdir /usr/local/var/postgres/pg_twophase
mkdir /usr/local/var/postgres/pg_stat
mkdir /usr/local/var/postgres/pg_stat_tmp
mkdir /usr/local/var/postgres/pg_replslot
mkdir /usr/local/var/postgres/pg_snapshots

Atau, lebih ringkas ( terima kasih kepada Nate ):

mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/

Menjalankan kembali pg_ctl start -D /usr/local/var/postgressekarang 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.

touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep

Catatan : Membuat .keepfile di direktori tersebut akan membuat beberapa noise di logfile Anda, tetapi tampaknya tidak mempengaruhi hal lain secara negatif.

Donovan
sumber
53
Hanya saran untuk perintah yang lebih ringkas: 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
Nate
26
File-file .keep itu benar-benar membuat saya sedih di log server:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost
13
Saya juga kehilangan direktori pg_snapshots dan pg_stat.
Jon Stevens
8
Saya juga harus membuat satu direktori tambahan 'pg_replslot'. Kecuali itu berfungsi dengan baik. Terima kasih!
Lucas
6
berpengalaman sama seperti @Lucas untuk postgres botol 9.4.0. Saya harus mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell
9

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 saya pg_logical/mappings, jadi Anda mungkin ingin mengatur terminal yang sedang berjalan:

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

dan tontonlah folder yang hilang saat Anda melakukan aktivitas basis data Anda.

tony_k
sumber
3
Diperlukan untuk menambahkan mkdir -p / usr / local / var / postgres / pg_logical / {snapshots, mappings}
peter_v
6

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 fastuntuk membunuh server PostgreSQL tetapi tidak berhasil. Saya juga mencoba pergi setelah proses langsung dengan kill PIDtetapi segera setelah saya melakukan proses PostgreSQL muncul kembali dengan PID yang berbeda.

Kunci akhirnya menjadi .plistfile yang dimuat Homebrew ... Perbaikan untuk saya akhirnya menjadi:

launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist

Setelah itu saya dapat memulai PostgreSQL secara normal.

MCP
sumber
Plist saya diberi nama sedikit berbeda: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plisttetapi pada dasarnya itu juga masalah yang sama bagi saya, dan solusi yang sama.
onekiloparsec
4

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 .plistfile yang disarankan oleh homebrew yang memulai PostgreSQL, Anda dapat menemukan direktori data di sana:

cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

(itu adalah -Dopsi yang Anda mulai dengan postgres :)

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/postgres</string>
    <string>-D</string>
    <string>/usr/local/pgsql/data</string>

Pada contoh di atas, Anda akan membuat direktori yang hilang /usr/local/pgsql/data, seperti:

cd /usr/local/pgsql/data
mkdir {pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots,pg_logical}
mkdir pg_logical/{snapshots,mappings}
tee
sumber
-20

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

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres
Greg
sumber
19
Jelas menghapus basis data yang ada bukan pengecualian kecil di sini. Ini sedikit seperti mengatakan "Saya tidak dapat menemukan / var / tmp jadi saya menginstal ulang sistem operasi."
Adam Donahue
4
Oh, bung, ini "lebih bersih" daripada yang bisa kupikirkan :) Semoga saja copy-paster acak dari interwebz tidak menembak ini langsung ke konsol mereka tanpa melihatnya :)
Halil Özgür
2
Maaf untuk suara turun Greg, tetapi saya sarankan untuk menulis ulang solusi Anda untuk membuatnya jelas bahwa pendekatan ini hanya boleh digunakan dalam pengembangan atau jika pengguna mampu menghapus DB mereka.
hraynaud
1
Mengapa hal ini begitu diremehkan? Di server dev, ini adalah cara yang benar.
Jordon Bedwell
@JordonBedwell bahkan pada server dev adalah ide yang buruk, kecuali jika Anda bermain dengan satu aplikasi menggunakan db di komputer Anda. Ini seperti "Saya tidak dapat memulai editor kode favorit saya, mari kita instal ulang OS"
Andre Figueiredo