PostgreSQL berjalan secara lokal tetapi saya tidak dapat terhubung. Mengapa?

32

Baru-baru ini memperbarui mesin saya dari Mac OS X Lion (10.7.4) ke Mountain Lion (10.8) dan saya pikir itu merusak instalasi PostgreSQL saya. Itu diinstal awalnya melalui Homebrew. Saya bukan DBA, tetapi berharap seseorang dapat memberi tahu saya cara mengatasi masalah ini.

Saya tidak dapat terhubung (tetapi bisa sebelum pra-Mountain Lion):

$ psql -U rails -d myapp_development
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

Tetapi Postgres masih berjalan dengan jelas:

$ ps aux | grep postgres
meltemi          2010   0.0  0.0  2444124   5292   ??  Ss   Wed01PM   0:00.02 postgres: rails myapp_development [local] idle    
meltemi           562   0.0  0.0  2439312    592   ??  Ss   Wed12PM   0:02.28 postgres: stats collector process       
meltemi           561   0.0  0.0  2443228   1832   ??  Ss   Wed12PM   0:01.57 postgres: autovacuum launcher process       
meltemi           560   0.0  0.0  2443096    596   ??  Ss   Wed12PM   0:02.89 postgres: wal writer process       
meltemi           559   0.0  0.0  2443096   1072   ??  Ss   Wed12PM   0:04.01 postgres: writer process       
meltemi           466   0.0  0.0  2443096   3728   ??  S    Wed12PM   0:00.85 /usr/local/bin/postgres -D /usr/local/varpostgres -r /usr/local/var/postgres/server.log

Dan itu menanggapi pertanyaan (baik untuk tes db dan pengembangan db) dari aplikasi Rails lokal

  User Load (0.2ms)  SELECT "users".* FROM "users" 
  Rendered users/index.html.haml within layouts/application (1.3ms)

Tampaknya tidak ada /var/pgsql_socket/direktori, apalagi /var/pgsql_socket/.s.PGSQL.5432file socket yang disebutkan di atas!?! Mungkin pemasangan Lion Mountain menghapusnya?

$ ls -l /var/ | grep pg
drwxr-x---   2 _postgres  _postgres    68 Jun 20 16:39 pgsql_socket_alt

Bagaimana saya bisa memecahkan masalah ini?

Meltemi
sumber
Bukan admin postgres, tetapi file socket yang hilang terdengar benar. Buat direktori / var / pgsql_socket (dengan pengguna Anda memiliki izin menulis) dan mulai ulang server. Lihat apakah itu memperbaikinya
Derek Downey
Pertanyaan terkait pada SO . Sepertinya Apple tidak melakukan pekerjaan yang baik dengan upgrade.
Erwin Brandstetter
apakah ada penyebutan file socket yang dibuat dalam file log /usr/local/var/postgres/server.log?
Philᵀᴹ
@ErwinBrandstetter Bagaimana Anda mengharapkan Apple melakukan "pekerjaan bagus" untuk meningkatkan aplikasi pihak ke-3 * nix yang diinstal secara manual?
Philᵀᴹ
@ Phil- tidak disebutkan. Saya mulai berpikir ini mungkin masalah variabel path. Saya pikir saya telah $PATHberubah dengan peningkatan yang /usr/binada di depan /usr/local/bindan saya pikir Mountain Lion mungkin datang dengan PostgreSQL pra-instal!?! Investigasi ...
Meltemi

Jawaban:

30

Saya menemukan bahwa saya memiliki masalah yang sangat mirip, yaitu postgres sedang membuka soket di /var/pgsql_socket_altmana tidak ada perangkat lunak saya mengharapkan untuk melihat, tetapi solusi untuk masalah saya tidak hanya masalah dengan saya $PATH.

Aku harus membuat direktori /var/pgsql_socket, chown untuk diriku sendiri, dan set unix_socket_directorydi postgresql.conf(terletak di /usr/local/var/postgres) ke direktori tersebut, kemudian gunakan pg_ctlbiner dalam /usr/local/binuntuk memulai postgres hak Server berhasil (yang mana $PATHdatang dalam - pastikan which pg_ctlresolve ke /usr/local/bin/pg_ctl, atau hanya selalu sebut saja secara eksplisit).

Ini mungkin membantu pengguna lain yang menemukan pertanyaan ini melalui /var/pgsql_socket_altpenyebutan.

Akan
sumber
Menarik. Apakah Anda juga di Mountain Lion? Apakah Anda menginstal PostgreSQL dengan Homebrew? Jika demikian, bertanya-tanya apakah ada orang lain yang dapat memverifikasi solusi ini sebagai ganti mengubah saya $PATHseperti yang saya lakukan.
Meltemi
Ya, ya, dan saya harap begitu!
Will
@ wolftron solusi Anda tepat untuk saya (Mountain Lion, homebrew / postgres, / var / pgsql_socket_alt, kesembilannya). Apakah ini masalah baru pada Mountain Lion dengan homebrew? Saya akan membuka tiket dengan mereka jika Anda pikir begitu.
Sepertinya kami sudah mendapat verifikasi dari @Jamie.
Will
Saya dapat mengkonfirmasi masalah ini dan solusinya pada OS X 10.8.2 / buatan instalasi postgresql 9.2.1.
Hartwig
8

Penjelasan yang masuk akal dan khas adalah bahwa psqlyang datang dengan homebrew /usr/local/bin/psqlberbeda dengan yang ada di $ PATH Anda, seperti /usr/bin/psql(dibundel dengan OS X). Anda mungkin ingin mencoba dengan path lengkap:

$ /usr/local/bin/psql -U rails -d myapp_development

Juga, ada sesuatu yang agak tidak biasa dalam psoutput pertanyaan Anda: server postgres berjalan di bawah meltemipengguna Unix, sedangkan umumnya, postgrespengguna Unix yang berdedikasi digunakan untuk itu.

Daniel Vérité
sumber
Juga, _postgres(dengan garis bawah) untuk pengguna / grup tidak diketahui oleh saya. Apakah itu artefak atau diharapkan?
Erwin Brandstetter
Ya, tampaknya ada $PATHmasalah seperti yang Anda nyatakan. Hal-hal berfungsi seperti sebelumnya ketika saya gunakan /usr/local/bin/psqluntuk mengakses database. Baik Lion tidak memiliki sistem PostgreSQL atau $ PATH saya diatur secara berbeda. Sudah setahun sejak terakhir kali aku kacau dengan ini jadi aku tidak ingat persis. Sedangkan untuk pengguna Unix ... dengan instalasi PostgreSQL Homebrew, server diluncurkan oleh launchd dan pengguna disetel ke pengguna lokal yang menginstalnya, sebagai default. Berbagai hal diatur secara berbeda pada Mac OS X Server yang memulai PostgreSQL secara otomatis di bawah postgres.
Meltemi
4

Saya tidak tahu ada file konfigurasi untuk klien psql. Namun psql menghormati sejumlah variabel lingkungan yang berkorelasi dengan opsi baris perintah.

Jadi untuk memiliki psql secara otomatis menggunakan soket pilihan Anda, Anda dapat mengatur variabel PGHOST ke direktori yang berisi soket. yaitu

PGHOST=/var/pgsql_socket_alt
psql -d mydatabsase
happynix
sumber
1
Itu tidak didokumentasikan di mana pun saya dapat menemukan bahwa Anda dapat mengatur PGHOST ke direktori tempat file socket hidup. Tapi itu ternyata bekerja. Terima kasih!
Andrew Schulman
3

Mencoba:

psql -U rails -d myapp_development -h localhost

atau

psql -U rails -d myapp_development -h 127.0.0.1
Miguel
sumber
3

Terlambat, tetapi saya menemukan ini membantu: http://tammersaleh.com/posts/installing-postgresql-for-rails-3-1-on-lion

Itu untuk Lion, tetapi saya mengalami masalah yang sama dengan yang ada di utas ini setelah memutakhirkan dari 10.6.8 ke Mountain Lion dan menginstal PostgreSQL via HomeBrew sebelumnya pada 10.6.8. Saya juga punya /var/pgsql_socket_altfolder post-upgrade misterius , tapi saya baru saja menghapusnya dan dibuat /var/pgsql_socketseperti yang disarankan oleh @wolftron. Namun, itu bukan solusi terakhir.

Jika saya dibiarkan unix_socket_directorykosong / dikomentari postgresql.conf, proyek apa pun yang ada sebelum peningkatan akan mengeluh bahwa soket masuk /var/pgsql_sockettidak ada. Tetapi jika saya mengganti conf dan hard-coded var/pgsql_socket, setiap proyek baru akan mengeluh bahwa soketnya /tmphilang. Sangat frustasi ... sampai saya menginstal ulang pg gemdi proyek pra-10.8 ( gem uninstall pg && gem install pg) dan meninggalkan unix_socket_directorykomentar dalam conffile. Setelah cepat pg_ctluntuk me-restart server, proyek-proyek baru dan lama berhasil. Soket pgsql saya hidup /tmpsekarang, fwiw.

Sidenote: jika Anda menggunakan activerecord-postgresql-adapterpermata, hapus instalan terlebih dahulu, lalu instal ulang pg, lalu instal activerecord-postgresql-adapterlagi.

Kaki
sumber
2

Saya baru saja mendaftar ke dba SE, jadi sepertinya tidak dapat mengomentari posting yang relevan (apa yang tempayan!).

Namun, saya yakin bahwa saya berada di kapal yang sama dengan @ thure. Saya telah memastikan / usr / local / bin lebih awal di PATH saya daripada / usr / bin, telah memeriksa biner mana yang telah diacak oleh shell whichdan type, dll.

Saya melihat gejala yang sama dengan @thure. Kemudian saya memiliki pencerahan; Saya menyadari bahwa saya akan membangun kembali pgpermata (saya menggunakan Ruby) di shell yang PATH-nya telah dipengaruhi oleh path_helper Mac (yang dijalankan dari / etc / profile dan menempatkan / usr / bin sebelum / usr / local / bin) .

Saya menghapus pg dan menginstalnya kembali di shell yang PATH-nya benar. Tiba-tiba saya bisa terhubung!

Jadi pastikan Anda mengkompilasi ulang bahasa Anda mengikat orang, dan biarkan mereka menemukan salinan yang benar (mungkin) pg_config.

Graham Ashton
sumber
1

Saya menemukan bahwa menghubungkan lokasi aktual ke lokasi yang diharapkan berfungsi dengan baik:

sudo ln -s /var/pgsql_socket_alt /var/pgsql_socket

sepanjang baris jawaban yang diterima oleh @ thure tetapi lebih sederhana.

Danny Roberts
sumber
1

Ini dia, 2016, El Capitan ada di luar sana, dan Apple terus mengubah keadaan. Postgres diinstal sebagai bagian dari OS, dan file konfigurasi postgres menetapkan properti unix_socket_directories di postgresql.conf ke / tmp. Soketnya ada di /tmp/.s.PGSQL.5432. Saya dapat mengatasi masalah dengan menjalankan yang berikut:

sudo ln -s /tmp /var/pgsql_socket

Semoga ini bisa membantu seseorang.

rdiddly
sumber
1

Cari file socket yang benar

find / -name .s.PGSQL.5432 -ls

Dari hasil mendapatkan path ke file dan gunakan path dengan parameter "-h" dalam perintah psql

Sebagai contoh, ini adalah cara saya terhubung ke database Server Kalender dan Kontak macOS (dalam sesi ssh ke server):

sudo psql -U _calendar -h /private/var/run/caldavd/PostgresSocket/ -d caldav

Kemudian, file soket di jalur akan digunakan untuk terhubung.

Olaf Seifert
sumber
1

Secara default postgres tampaknya mencoba untuk terhubung melalui unix-domain-sockets. SOCKET DOMAIN UNIX

Ini terjadi pada saya ketika saya menjalankan instance postgres di buruh pelabuhan. Anda harus melihat jenis koneksi apa yang diterima server Anda. Bagi saya itu jelas TCP dan bukan unix soket domain.

Menambahkan tanda untuk menerima host mengarahkan koneksi ke jalur yang benar dan memperbaiki masalah.

psql -U username -p port -h host

PS: Soket domain Unix berfungsi pada level kernel dan koneksi tidak harus melalui semua jazz yang diperlukan untuk koneksi TCP. Mereka sangat cepat dan efisien ketika Anda ingin membuat koneksi ke mesin Anda sendiri dari proses yang berbeda sebagai bagian dari Komunikasi Interprocess.

Sudip Bhandari
sumber
0

Halo dunia :)
Cara terbaik tetapi aneh bagi saya adalah melakukan hal-hal selanjutnya.

1) Unduh postgres93.app atau versi lain. Tambahkan aplikasi ini ke / Aplikasi / folder.

2) Tambahkan baris (perintah) ke dalam file .bash_profile(yang ada di direktori home saya):

export PATH = / Aplikasi / Postgres93.app / Contents / MacOS / bin /: $ PATH
Ini adalah PATH psqldari Postgres93.app. Baris (perintah) berjalan setiap kali konsol dimulai.

3) Luncurkan Postgres93.appdari /Applications/folder. Ini memulai server lokal (port adalah "5432" dan host adalah "localhost").

4) Setelah semua manipulasi ini saya senang menjalankan $ createuser -SRDP user_namedan perintah lainnya dan melihat bahwa itu berhasil! Postgres93.appdapat dibuat untuk dijalankan setiap kali sistem Anda mulai.

5) Juga jika Anda ingin melihat database Anda secara grafis Anda harus menginstal PG Commander.app. Ini cara yang baik untuk melihat postgres DB Anda sebagai tabel data yang cantik

Tentu saja, ini hanya bermanfaat untuk server lokal. Saya akan senang jika instruksi ini membantu orang lain yang menghadapi masalah ini.

crazzyaka
sumber
0

Saya mendapat kesalahan yang sama dari mencoba menjalankan psqlpada baris perintah. Ternyata solusi saya jauh lebih sederhana. Saya salah mengonfigurasi port mendengarkan di file konfigurasi: /etc/postgresql/9.4/main/postgres.conf . Saya telah mengubah port dari port = 5432 ke port = 5433. Ketika saya mengubahnya kembali ke 5432, itu berfungsi seperti yang diharapkan.

Untuk menguji apakah Anda telah melakukan sesuatu yang serupa, Anda dapat menjalankan. $ psql -p5433 Ada sejumlah opsi berguna seperti ini untuk perintah psql yang dapat Anda temukan di sini: http://www.postgresql.org/docs/9.4/static/app-psql .html sehingga Anda dapat menguji kesalahan konfigurasi SENDIRI Anda sendiri. Tentu saja, Anda cukup menghapus set perubahan konfigurasi terakhir Anda dari file * .conf, juga untuk menguji apakah itu adalah sumber masalah Anda. Saya pikir itu pasti patut dicoba sebelum Anda muck tentang dengan izin file dan kepemilikan. (Jangan lupa untuk /etc/init.d/postgresql restart)

Apa yang saya TIDAK bisa temukan adalah file konfigurasi yang menetapkan nilai default untuk perintah psql CLI. Bisakah seseorang mengomentari hal itu?

Bagi saya, saya selalu kembali ke prinsip pertama pemrograman: "Saya biasanya sumber kesalahan yang diberikan!"

Mungkin kita semua robot
sumber