Máy chủ Postgresql không khởi động


13

[Ubuntu 16.04] Tôi đã cài đặt postgresql 9.5 cùng với các phụ thuộc:

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

Khi tôi muốn chạy psqlthì tôi nhận được:

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

Nhưng /var/run/postgresql/trống rỗng. Khi tôi khởi động lại posgresql, mọi thứ đều ổn:

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

nhưng nếu kiểm tra ps auxthì không có PID như vậy (tại sao ??)

Tổng số phục hồi không giúp đỡ gì cả. Làm thế nào tôi có thể sửa chữa nó?


Tệp /var/log/posegtresql/postgresql-9.5-main.log hiển thị gì?
ubfan1

tập tin này trống
mike927

Câu trả lời:


14

Đây là một đặc điểm riêng của sự tích hợp hệ thống của PostgreSQL trong Xenial.

Đơn vị dịch vụ postgresql được cài đặt bởi gói chung postgresql chỉ là một dịch vụ giả khiến dịch vụ thực tế postgresql@9.6- chính được bắt đầu thông qua một phụ thuộc. Bạn có thể thấy sự phụ thuộc đó bằng cách chạy lệnh

systemctl list-dependencies postgresql

Sự phụ thuộc đó không phải là vĩnh viễn, nhưng được tạo ra trong quá trình khởi động hệ thống bởi trình tạo systemd /lib/systemd/system-generators/postgresql-generatorđi kèm với gói chung postgresql. Trình tạo kiểm tra xem chế độ khởi động trong tệp /etc/postgresql/9.6/main/start.confcó được đặt thành hay không autovà nếu có, sẽ thiết lập sự phụ thuộc mà sau đó gây ra phiên bản 9.6-main được khởi động.

(Chính xác hơn, nó kiểm tra tất cả các thư mục con cấu hình /etc/postgresql/*/*và sẽ tạo ra các phụ thuộc cho tất cả các phiên bản được cấu hình để khởi động tự động, nhưng trong cài đặt mặc định sẽ chỉ có một phiên bản.)

Do những hạn chế của trình tạo systemd (xem man systemd.generator) quá trình này có thể thất bại, khiến cho các phụ thuộc không có sau khi khởi động lại. Systemd sau đó sẽ chỉ bắt đầu dịch vụ giả, viết

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

vào nhật ký nhưng nếu không làm gì. Cố gắng khởi động dịch vụ bằng tay

systemctl start postgresql

sẽ chỉ tái tạo kết quả đó. Chạy lệnh

systemctl daemon-reload

theo cách thủ công là root sẽ chạy lại trình tạo và trong hầu hết các trường hợp, khắc phục sự cố cho đến lần khởi động lại tiếp theo.

Để giải quyết vấn đề vĩnh viễn, bạn sẽ phải tìm lý do tại sao trình tạo bị lỗi trong khi khởi động. Nguyên nhân có thể có thể được tìm thấy trong trang web systemd.generator. Trong trường hợp của tôi, đó là tệp cấu hình PostgreSQL /etc/postgresql/9.6/main/postgresql.confđược liên kết với một hệ thống tệp khác chưa có sẵn khi trình tạo chạy sớm trong khi khởi động. postgresql-generatorkiểm tra sự tồn tại của tập tin đó mặc dù nó không cần nó.


Vui lòng chỉnh sửa câu trả lời của bạn khi bạn quản lý để giải quyết vấn đề :)
bão

9

Mở rộng câu trả lời của Tilman, nhưng không đủ Kudos để bình luận ...

Nếu bạn không cần dịch vụ để được gọi là postgresql và không quan tâm đến dịch vụ giả bao bọc, thì nó chỉ hoạt động để kiểm soát trực tiếp dịch vụ thực. Tên của nó là: postgresql@$version-$cluster.service Trong trường hợp của bạn, nó phải là postgresql-9.5-main . Thích bắt đầu

systemctl start postgresql@9.5-main

và dừng lại:

systemctl stop postgresql@9.5-main

Status cũng sẽ cung cấp cho bạn thông tin chính xác và tốt hơn nhiều so với dịch vụ trình bao bọc được tạo tự động.

systemctl status postgresql@9.5-main

Đối với 9.6, nó trông như thế này:

● 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

Trong trường hợp của tôi, điều này có liên quan đến các địa phương được cấu hình không chính xác.

Tôi đã tìm thấy giải pháp trong câu trả lời dba.stackexchange.com này :

  1. Sử dụng sudo dpkg-reconfigure localesđể tạo các địa điểm cần thiết
  2. Thả cụm cơ sở dữ liệu hiện có qua sudo pg_dropcluster 9.5 main(điều này sẽ xóa tất cả dữ liệu trong cụm!)
  3. Tạo lại cụm thông qua sudo pg_createcluster 9.5 main --start
  4. Khởi động lại PostgreSQL qua sudo service postgresql restart

1

tốt hơn là sử dụng các tập lệnh khởi động systemd với Ubuntu 16.04, các tập lệnh init có thể không hoạt động chính xác trong những ngày này. Postgres 9.5 đã có trong repos ubfox, vì vậy hãy thử thay vào đó, nó nên có hệ thống khởi động.


sử dụng repo
ub

đó là một sự xấu hổ, có vẻ như những người postgres vẫn chưa hiểu rõ về systemd. Bạn có thể nên đưa ra một lỗi đối với gói postgres hoặc hỏi trên danh sách gửi thư của họ về hỗ trợ systemd. Tôi không sử dụng postgres nhiều nhưng một số dự án nguồn mở đã có lập trường chống lại systemd hoặc có thể bị vướng vào các cuộc tranh luận nội bộ về việc hỗ trợ nó.
Amias

Khi tôi chạy systemctl, nó trả về "postgresql@9.5-main.service đã tải thất bại PostgreQuery Cluster 9.5-main". Tại sao nó thất bại?
mike927

Trong trường hợp này, đó là các tập lệnh khởi động systemd không hoạt động chính xác nên lời khuyên không thực sự hữu ích.
Tilman

1

Một "bị cắn bởi điều này".

Phiên bản pg_upgradeclusterthực sự để lại phiên bản đích (9.6) ở chế độ "thủ công" trên cổng 5433 và phiên bản nguồn (9.5) tại cổng 5432.

Ngay cả sau đó pg_dropcluster 9.5. Chỉnh sửa tệp start.conf không giúp được gì, nhưng gợi ý là sử dụng systemctl daemon-reload, vì trình tạo quyết định dựa trên tệp cấu hình này xem có liên kết tệp dịch vụ không:

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

Vì vậy, nếu cụm bạn muốn bắt đầu không có từ "tự động" trong start.conf, bạn cần thực hiện tải lại hệ thống (hoặc khởi động lại) để bật nó khi khởi động.

Vẫn phải xác minh điều này với một khởi động lại, nhưng đưa ra ở trên khá tự tin đó là vấn đề.


1

Tôi đã vô hiệu hóa "siêu dịch vụ" ma thuật như thế này:

root@server# systemctl disable postgresql

Sau đó, tôi kích hoạt dịch vụ bê tông:

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

Sau khi khởi động lại mọi thứ hoạt động trở lại.


0

Có lỗi tương tự, lãng phí giờ, giải pháp đơn giản. Kiểm tra câu hỏi SO này và câu trả lời của tôi, đó là:

sudo service postgresql restart

0

Tôi gặp vấn đề này do một lý do khác: quyền thư mục. Tôi đã có một chmod quét toàn bộ như thế này:

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

Điều này đặt thư mục là không thể thực thi, điều này ngăn cản các postgres đọc nó.


0

Tôi gặp vấn đề tương tự khi kiểm tra sự cố với sự cho phép của ssl-cert-snoil.key.

Đặt quyền sở hữu

gốc chown: ssl-cert ssl-cert-snoil.key chmod 640 ssl-cert-snoil.key

và đã khởi động lại sạch sẽ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.