Сервер 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

Це ідіосинкразія системної інтеграції 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-головний повинен бути запущений.

(Точніше, він перевіряє всі підкаталоги конфігурації /etc/postgresql/*/*і створить залежності для всіх екземплярів, налаштованих для автоматичного запуску, але в установці за замовчуванням буде лише один екземпляр.)

Через обмеження системних генераторів (див. man systemd.generator) Цей процес може вийти з ладу, внаслідок чого залежності відсутня після перезавантаження. Потім Systemd запустить лише сервісну службу, пишучи

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

до журналу, але інакше нічого не роблячи. Спроба запустити послугу вручну

systemctl start postgresql

просто відтворить цей результат. Запуск команди

systemctl daemon-reload

вручну, оскільки root повторно запустить генератор і в більшості випадків виправить проблему до наступної перезавантаження.

Щоб вирішити проблему назавжди, вам доведеться знайти причину, по якій генератор виходить з ладу під час завантаження. Можливі причини можна знайти на сторінці systemd.generator. У моєму випадку це був конфігураційний файл PostgreSQL, /etc/postgresql/9.6/main/postgresql.confякий був пов'язаний з іншою файловою системою, яка ще не була доступною, коли генератор запускався рано під час завантаження. postgresql-generatorперевіряє існування цього файлу, навіть якщо він інакше йому не потрібен.


Сміливо редагуйте свою відповідь, коли вам вдасться вирішити питання :)
штурм

9

Продовжуючи відповідь Тільмана, але недостатньо Кудоса для коментарів ...

Якщо вам не потрібна послуга, яку потрібно називати postgresql, і ви не піклуєтесь про сервісну манекенницю для обгортки, вам слід працювати лише над тим, щоб безпосередньо контролювати реальну послугу. Це ім'я: 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

краще використовувати системні сценарії запуску з ubuntu 16.04, скрипти init можуть працювати неправильно в наші дні. Postgres 9.5 вже знаходиться у репортажі ubuntu, тому спробуйте, замість цього, він мав би мати системний запуск.


використовуючи стандартний ubuntu repo, я отримую той самий результат
mike927,

ось ганьба, схоже на те, що люди з постгресу ще не причепилися до системи. Ймовірно, ви повинні підняти помилку щодо пакету postgres або запитати у їх списку розсилки про підтримку системи. Я не дуже використовую postgres, але деякі проекти з відкритим кодом виступили проти систематизованих або, можливо, заплутаних у внутрішніх дебатах щодо його підтримки.
Амія

коли я запускаю systemctl, він повертає "postgresql@9.5-main.service fail failed. PostgreSQL Cluster 9.5-main". Чому це не вдалося?
mike927

Добре, що в цьому випадку це системні сценарії запуску, які не працюють належним чином, тому поради не дуже корисні.
Тільман

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

Я відключив магічну "супер-службу" на зразок цього:

root@server# systemctl disable postgresql

Тоді я активував конкретну службу:

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

Після перезавантаження все працювало знову.


0

Були однакові помилки, витрачені години, просте рішення. Перевірте це питання та мою відповідь. Це:

sudo service postgresql restart

0

У мене була ця проблема через іншу причину: дозволи довідників. У мене був Chmod на повній розгортці так:

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

Це встановлює каталог як невиконаний, що не дозволяє читати поштамтри.


0

У мене була ця сама проблема при перевірці знайденої проблеми з дозволом ssl-cert-snakeoil.key.

Встановити право власності

корінь чоуна: ssl-cert ssl-cert-snakeoil.key chmod 640 ssl-cert-snakeoil.key

і зробив чистий перезапуск.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.