เซิร์ฟเวอร์ Postgresql ไม่เริ่มทำงาน


14

[Ubuntu 16.04] ฉันติดตั้ง postgresql 9.5 พร้อมการพึ่งพา:

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

เมื่อฉันต้องการเรียกใช้psqlแล้วฉันได้รับ:

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"?

แต่/var/run/postgresql/ว่างเปล่า เมื่อฉันรีสตาร์ท posgresql ทุกอย่างดูเหมือนจะไม่เป็นไร:

$ /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)

แต่ถ้าตรวจสอบps auxว่าไม่มี PID ดังกล่าว (ทำไม ??)

การคืนสถานะทั้งหมดไม่ได้ช่วยอะไรเลย ฉันจะแก้ไขได้อย่างไร


ไฟล์ /var/log/posgtresql/postgresql-9.5-main.log แสดงข้อมูลอะไร
ubfan1

ไฟล์นี้ว่างเปล่า
mike927

คำตอบ:


14

นี่เป็นลักษณะเฉพาะของการรวม systemd ของ PostgreSQL ใน Xenial

หน่วยบริการ postgresql ที่ติดตั้งโดยแพ็คเกจทั่วไป postgresql เป็นเพียงบริการดัมมี่ซึ่งเป็นสาเหตุให้บริการจริง postgresql@9.6-main เริ่มทำงานผ่านการพึ่งพา คุณสามารถดูการพึ่งพานั้นได้โดยการรันคำสั่ง

systemctl list-dependencies postgresql

การพึ่งพานั้นไม่ได้ถาวร แต่สร้างขึ้นระหว่างการบูทระบบโดยตัวสร้าง systemd /lib/systemd/system-generators/postgresql-generatorซึ่งมาพร้อมกับแพ็คเกจทั่วไป postgresql เครื่องกำเนิดตรวจสอบว่าโหมดเริ่มต้นในไฟล์/etc/postgresql/9.6/main/start.confถูกตั้งค่าเป็นautoและถ้าเป็นเช่นนั้นตั้งค่าการพึ่งพาที่ทำให้อินสแตนซ์ 9.6-main เริ่มทำงานในภายหลัง

(แม่นยำยิ่งขึ้นจะตรวจสอบไดเรกทอรีย่อยการกำหนดค่าทั้งหมด/etc/postgresql/*/*และจะสร้างการอ้างอิงสำหรับทุกอินสแตนซ์ที่กำหนดค่าสำหรับการเริ่มต้นอัตโนมัติ แต่ในการติดตั้งเริ่มต้นจะมีเพียงหนึ่งอินสแตนซ์)

เนื่องจากข้อ จำกัด ของตัวกำเนิด systemd (ดูman systemd.generator) กระบวนการนี้อาจล้มเหลวทำให้การอ้างอิงไม่อยู่หลังจากรีบูต Systemd จะเริ่มทำงานเฉพาะบริการจำลองเท่านั้น

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

ไปที่บันทึก แต่ไม่ทำอะไรเลย พยายามเริ่มบริการด้วยตนเองโดย

systemctl start postgresql

จะทำซ้ำผลลัพธ์นั้น กำลังรันคำสั่ง

systemctl daemon-reload

ด้วยตนเองเมื่อรูทจะรันตัวสร้างใหม่และในกรณีส่วนใหญ่จะแก้ไขปัญหาจนกว่าจะรีบูตครั้งถัดไป

ในการแก้ปัญหาอย่างถาวรคุณจะต้องค้นหาสาเหตุที่เครื่องกำเนิดไฟฟ้าล้มเหลวระหว่างการบู๊ต สาเหตุที่เป็นไปได้สามารถพบได้ใน systemd.generator manpage ในกรณีของฉันมันเป็นไฟล์กำหนดค่า PostgreSQL /etc/postgresql/9.6/main/postgresql.confซึ่งเชื่อมโยงกับระบบไฟล์อื่นที่ยังไม่พร้อมใช้งานเมื่อเครื่องกำเนิดไฟฟ้าทำงานเร็วในระหว่างการบู๊ต postgresql-generatorตรวจสอบการมีอยู่ของไฟล์นั้นแม้ว่าจะไม่จำเป็นต้องใช้


อย่าลังเลที่จะแก้ไขคำตอบของคุณเมื่อคุณจัดการเพื่อแก้ปัญหา :)
พายุ

9

ขยายคำตอบของ Tilman แต่ Kudos ไม่เพียงพอที่จะแสดงความคิดเห็น ...

หากคุณไม่ต้องการใช้บริการที่เรียกว่า postgresql และไม่สนใจเกี่ยวกับบริการจำลองของ wrapper ควรทำงานเพื่อควบคุมบริการจริงโดยตรง ชื่อของมันคือ: postgresql@$version-$cluster.serviceในกรณีของคุณมันควรจะเป็นpostgresql-9.5-mainในระยะสั้น ชอบที่จะเริ่ม

systemctl start postgresql@9.5-main

และหยุด:

systemctl stop postgresql@9.5-main

สถานะจะให้ข้อมูลที่ดีกว่าและแม่นยำกว่าบริการห่อหุ้มรถยนต์ที่สร้างขึ้นโดยอัตโนมัติ

systemctl status postgresql@9.5-main

สำหรับ 9.6 ดูเหมือนว่านี้:

● postgresql@9.6-main.service - PostgreSQL Cluster 9.6-main
   Loaded: loaded (/lib/systemd/system/postgresql@.service; 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/postgresql@9.6-main.service
           ├─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

4

ในกรณีของฉันสิ่งนี้เกี่ยวข้องกับสถานที่ที่กำหนดค่าไว้ไม่ถูกต้อง

ฉันพบวิธีแก้ปัญหาในคำตอบ dba.stackexchange.com นี้ :

  1. ใช้sudo dpkg-reconfigure localesเพื่อสร้างสถานที่ที่จำเป็น
  2. ปล่อยคลัสเตอร์ฐานข้อมูลที่มีอยู่ผ่านsudo pg_dropcluster 9.5 main(ซึ่งจะลบข้อมูลทั้งหมดในคลัสเตอร์!)
  3. สร้างคลัสเตอร์อีกครั้งผ่าน sudo pg_createcluster 9.5 main --start
  4. รีสตาร์ท PostgreSQL ผ่าน sudo service postgresql restart

1

มันจะดีกว่าที่จะใช้สคริปต์เริ่มต้น systemd กับอูบุนตู 16.04 สคริปต์เริ่มต้นอาจไม่ทำงานอย่างถูกต้องในวันนี้ Postgres 9.5 มีอยู่ในอูบุนตู repos แล้วให้ลองแทนมันควรจะมี systemd startup


ใช้ repo ubuntu มาตรฐานฉันได้รับผลลัพธ์เดียวกัน
mike927

น่าเสียดายที่ดูเหมือนว่าคน postgres ยังไม่ได้ติดระบบเลย คุณควรเพิ่มข้อผิดพลาดกับแพ็คเกจ postgres หรือถามในรายชื่อผู้รับจดหมายเกี่ยวกับการสนับสนุน systemd ฉันไม่ได้ใช้ postgres มากนัก แต่บางโครงการโอเพนซอร์ซมีท่าทางต่อต้าน systemd หรืออาจจะมีการโต้เถียงกันภายในเกี่ยวกับการสนับสนุน
Amias

เมื่อฉันเรียกใช้ systemctl มันจะคืนค่า "postgresql@9.5-main.service ที่โหลดล้มเหลวล้มเหลว PostgreSQL Cluster 9.5-main" ทำไมมันล้มเหลว
mike927

ในกรณีนี้มันเป็นสคริปต์การเริ่มต้น systemd ซึ่งทำงานไม่ถูกต้องดังนั้นคำแนะนำจะไม่เป็นประโยชน์
Tilman

1

อีก "ถูกกัดโดยสิ่งนี้"

pg_upgradeclusterจริงซ้ายรุ่นเป้าหมาย (9.6) ในโหมด "ด้วยตนเอง" ในพอร์ต 5433 และรุ่นแหล่งที่มา (9.5) ที่ท่าเรือ 5432

แม้หลังจากpg_dropcluster 9.5นั้น การแก้ไขไฟล์ start.conf ไม่ได้ช่วย แต่สิ่งสำคัญคือต้องใช้ systemctl daemon-reloadเนื่องจากตัวสร้างตัดสินใจตามไฟล์การกำหนดค่านี้ว่าจะเชื่อมโยงไฟล์บริการหรือไม่:

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

ดังนั้นหากคลัสเตอร์ที่คุณต้องการเริ่มต้นไม่มีคำว่า "auto" ใน start.conf คุณต้องทำการรีโหลดระบบ (หรือรีบูต) เพื่อให้สามารถเปิดใช้งานได้ในเวลาบูต

ยังคงต้องตรวจสอบสิ่งนี้ด้วยการรีบู๊ต แต่ให้ไว้ข้างต้นค่อนข้างมั่นใจว่าเป็นปัญหา


1

ฉันปิดการใช้งานเวทมนตร์ "super service" เช่นนี้:

root@server# systemctl disable postgresql

จากนั้นฉันเปิดใช้งานบริการคอนกรีต:

root@server:~# systemctl enable postgresql@9.5-main.service 

หลังจากรีบูตเครื่องทุกอย่างทำงานได้อีกครั้ง



0

ฉันมีปัญหานี้เนื่องจากเหตุผลที่แตกต่าง: สิทธิ์ไดเรกทอรี ฉันมี chmod กวาดเต็มเช่นนี้:

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

สิ่งนี้ตั้งค่าไดเร็กทอรีเป็น non-executable ซึ่งป้องกันมิให้ postgres อ่าน


0

ฉันมีปัญหาเดียวกันนี้เมื่อตรวจสอบปัญหาพบว่ามีสิทธิ์ ssl-cert-snakeoil.key

ตั้งค่าความเป็นเจ้าของ

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

และทำการรีสตาร์ทใหม่ทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.