Server Postgresql tidak dimulai

14

[Ubuntu 16.04] Saya menginstal postgresql 9.5 bersama dengan dependensi:

sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-common
sudo apt-get install postgresql-9.5 libpq-dev

Ketika saya ingin menjalankan psqlmaka saya mendapatkan:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Tetapi /var/run/postgresql/kosong. Ketika saya me-restart posgresql, semuanya tampak baik-baik saja:

$ /etc/init.d/postgresql restart
[ ok ] Restarting postgresql (via systemctl): postgresql.service.

$ /etc/init.d/postgresql status
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since wto 2016-09-27 16:18:26 CEST; 1min 15s ago
  Process: 3076 ExecReload=/bin/true (code=exited, status=0/SUCCESS)
  Process: 3523 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 3523 (code=exited, status=0/SUCCESS)

tetapi jika periksa ps auxtidak ada PID seperti itu (mengapa ??)

Pemasangan ulang total tidak membantu sama sekali. Bagaimana saya bisa memperbaikinya?

mike927
sumber
Apa yang ditunjukkan oleh file /var/log/posgtresql/postgresql-9.5-main.log?
ubfan1
file ini kosong
mike927

Jawaban:

14

Ini adalah keistimewaan dari integrasi systemd dari PostgreSQL di Xenial.

Unit layanan postgresql yang diinstal oleh paket umum postgresql hanyalah layanan dummy yang menyebabkan layanan [email protected] utama harus dimulai melalui dependensi. Anda dapat melihat ketergantungan itu dengan menjalankan perintah

systemctl list-dependencies postgresql

Ketergantungan itu tidak permanen, tetapi dihasilkan selama boot sistem oleh generator systemd /lib/systemd/system-generators/postgresql-generatoryang juga datang dengan paket postgresql-common. Generator memeriksa apakah mode startup dalam file /etc/postgresql/9.6/main/start.confdiatur ke auto, dan jika demikian, mengatur dependensi yang kemudian menyebabkan instance 9.6-main untuk dimulai.

(Lebih tepatnya, ia memeriksa semua subdirektori konfigurasi /etc/postgresql/*/*dan akan membuat dependensi untuk semua instance yang dikonfigurasikan untuk startup otomatis, tetapi dalam instalasi default hanya akan ada satu instance.)

Karena keterbatasan generator systemd (lihat man systemd.generator) proses ini mungkin gagal, menyebabkan dependensi tidak ada setelah reboot. Systemd kemudian hanya akan memulai layanan boneka, menulis

systemd[1]: Starting PostgreSQL RDBMS...
systemd[1]: Started PostgreSQL RDBMS.

ke log tetapi tidak melakukan apa-apa. Mencoba memulai layanan secara manual dengan

systemctl start postgresql

hanya akan mereproduksi hasil itu. Menjalankan perintah

systemctl daemon-reload

secara manual sebagai root akan menjalankan kembali generator dan dalam banyak kasus memperbaiki masalah sampai reboot berikutnya.

Untuk menyelesaikan masalah secara permanen, Anda harus menemukan alasan mengapa generator gagal saat boot. Kemungkinan penyebabnya dapat ditemukan di halaman systemd.generator. Dalam kasus saya, itu adalah file konfigurasi PostgreSQL /etc/postgresql/9.6/main/postgresql.confyang dikaitkan dengan sistem file yang berbeda yang belum tersedia ketika generator berjalan lebih awal saat boot. postgresql-generatormemeriksa keberadaan file itu meskipun sebenarnya tidak memerlukannya.

Tilman
sumber
Jangan ragu untuk mengedit jawaban Anda ketika Anda berhasil menyelesaikan masalah :)
storm
9

Memperluas jawaban Tilman, tetapi tidak cukup pujian untuk berkomentar ...

Jika Anda tidak memerlukan layanan yang disebut postgresql dan tidak peduli dengan layanan dummy pembungkus, itu harus bekerja hanya untuk mengontrol layanan nyata secara langsung. Namanya adalah: postgresql@$version-$cluster.service Dalam kasus Anda, seharusnya postgresql-9.5-main singkatnya. Ingin memulai

systemctl start [email protected]

dan untuk berhenti:

systemctl stop [email protected]

Status juga akan memberi Anda informasi yang jauh lebih baik dan akurat daripada pada layanan pembungkus otomatis.

systemctl status [email protected]

Untuk 9,6 terlihat seperti ini:

[email protected] - PostgreSQL Cluster 9.6-main
   Loaded: loaded (/lib/systemd/system/[email protected]; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2017-09-13 00:41:50 CEST; 7h ago
  Process: 10235 ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop (code=exited, status=2)
  Process: 10676 ExecStart=postgresql@%i --skip-systemctl-redirect %i start (code=exited, status=0/SUCCESS)
 Main PID: 10683 (postgres)
   CGroup: /system.slice/system-postgresql.slice/[email protected]
           ├─10683 /usr/lib/postgresql/9.6/bin/postgres -D /var/lib/postgresql/9.6/main -c config_file=/etc/postgresql/9.6/main/postgresql.conf
           ├─10685 postgres: 9.6/main: checkpointer process
           ├─10686 postgres: 9.6/main: writer process
           ├─10748 postgres: 9.6/main: wal writer process
           ├─10749 postgres: 9.6/main: autovacuum launcher process
           ├─10750 postgres: 9.6/main: archiver process   last was 000000020000000000000082
           ├─10751 postgres: 9.6/main: stats collector process
Alex K.
sumber
4

Dalam kasus saya ini terkait dengan lokal yang tidak dikonfigurasi dengan benar.

Saya telah menemukan solusi dalam jawaban dba.stackexchange.com ini :

  1. Gunakan sudo dpkg-reconfigure localesuntuk menghasilkan lokal yang diperlukan
  2. Jatuhkan cluster database yang ada melalui sudo pg_dropcluster 9.5 main(ini akan menghapus semua data dalam cluster!)
  3. Buat kembali cluster melalui sudo pg_createcluster 9.5 main --start
  4. Mulai ulang PostgreSQL via sudo service postgresql restart
Florian Brucker
sumber
1

lebih baik menggunakan skrip startup systemd dengan ubuntu 16.04, skrip init mungkin tidak berfungsi dengan baik hari ini. Postgres 9.5 sudah ada di dalam repositori ubuntu jadi cobalah itu, semestinya memiliki startup systemd.

Amias
sumber
menggunakan repo ubuntu standar saya mendapatkan hasil yang sama
mike927
Sayang sekali, sepertinya orang postgres belum memahami systemd. Anda mungkin harus meningkatkan bug terhadap paket postgres atau bertanya pada milis mereka tentang dukungan systemd. Saya tidak menggunakan postgres banyak tetapi beberapa proyek open source telah mengambil sikap terhadap systemd atau mungkin terlibat dalam perdebatan internal tentang mendukungnya.
Amias
ketika saya menjalankan systemctl ia mengembalikan "[email protected] gagal gagal gagal PostgreSQL Cluster 9.5-main". Kenapa gagal?
mike927
Nah dalam hal ini skrip startup systemd yang tidak berfungsi dengan baik sehingga sarannya tidak terlalu membantu.
Tilman
1

Lain "digigit oleh ini".

The pg_upgradeclusterbenar-benar meninggalkan versi target (9,6) dalam mode "manual" pada port 5433 dan versi source (9,5) di pelabuhan 5432.

Bahkan sesudahnya pg_dropcluster 9.5. Mengedit file start.conf tidak membantu, tetapi petunjuknya adalah untuk digunakan systemctl daemon-reload, karena generator memutuskan berdasarkan pada file konfigurasi ini apakah akan menyinkronkan file layanan:

for conf in /etc/postgresql/*/*/postgresql.conf; do
    # trimmed for brevity
    [ "$start" = "auto" ] || continue
    ln -s "$pgservice" "$wantdir/postgresql@$version-$cluster.service"
done

Jadi jika cluster yang ingin Anda mulai tidak memiliki kata "auto" di start.conf, Anda perlu melakukan sistem-reload (atau reboot) untuk mengaktifkannya pada saat boot.

Masih harus memverifikasi ini dengan reboot, tetapi mengingat hal di atas cukup percaya diri yang menjadi masalah.

Melvyn Sopacua
sumber
1

Saya menonaktifkan "layanan super" ajaib seperti ini:

root@server# systemctl disable postgresql

Kemudian saya mengaktifkan layanan beton:

root@server:~# systemctl enable [email protected] 

Setelah mem-boot semuanya kembali berfungsi.

guettli
sumber
0

Punya kesalahan yang sama, jam terbuang, solusi sederhana. Lihat pertanyaan SO ini dan jawaban saya, Yaitu:

sudo service postgresql restart
ToTenMilan
sumber
0

Saya punya masalah ini karena alasan berbeda: izin direktori. Saya memiliki chmod lengkap seperti ini:

chmod -R 644 /etc/postgresql/10/main

Ini menetapkan direktori sebagai tidak dapat dieksekusi, yang mencegah postgres membacanya.

seequ
sumber
0

Saya memiliki masalah yang sama saat memeriksa masalah yang ditemukan dengan izin ssl-cert-snakeoil.key.

Tetapkan Kepemilikan

chown root: ssl-cert ssl-cert-snakeoil.key chmod 640 ssl-cert-snakeoil.key

dan melakukan restart bersih.

Sudharsan Punniyakotti
sumber