O servidor Postgresql não inicia


13

[Ubuntu 16.04] Instalei o postgresql 9.5 junto com as dependências:

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

Quando quero correr psql, recebo:

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

Mas /var/run/postgresql/está vazio. Quando eu reinicio o posgresql, tudo parece estar bem:

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

mas se verificar ps auxnão existe tal PID (por quê ??)

A reinstalação total não ajuda em nada. Como posso corrigir isso?


O que mostra o arquivo /var/log/posgtresql/postgresql-9.5-main.log?
Ubfan1

este arquivo está vazio
mike927 27/09/16

Respostas:


14

Esta é uma idiossincrasia da integração de sistemas do PostgreSQL no Xenial.

A unidade de serviço postgresql instalada pelo pacote postgresql-common é apenas um serviço fictício que faz com que o serviço real postgresql@9.6-main seja iniciado por uma dependência. Você pode ver essa dependência executando o comando

systemctl list-dependencies postgresql

Essa dependência não é permanente, mas é gerada durante a inicialização do sistema pelo gerador systemd, /lib/systemd/system-generators/postgresql-generatorque também vem com o pacote postgresql-common. O gerador verifica se o modo de inicialização no arquivo /etc/postgresql/9.6/main/start.confestá definido comoauto , e se sim, configura a dependência que subsequentemente faz com que a instância 9.6-main seja iniciada.

(Mais precisamente, ele verifica todos os subdiretórios de configuração /etc/postgresql/*/*e cria dependências para todas as instâncias configuradas para inicialização automática, mas em uma instalação padrão, haverá apenas uma instância).

Devido às limitações dos geradores systemd (consulte man systemd.generator), esse processo pode falhar, fazendo com que as dependências estejam ausentes após uma reinicialização. O Systemd iniciará apenas o serviço fictício, escrevendo

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

para o log, mas, caso contrário, não fará nada. Tentativa de iniciar o serviço manualmente,

systemctl start postgresql

apenas reproduzirá esse resultado. Executando o comando

systemctl daemon-reload

manualmente, pois o root executará novamente o gerador e, na maioria dos casos, corrigirá o problema até a próxima reinicialização.

Para resolver o problema permanentemente, você precisará encontrar o motivo pelo qual o gerador falha durante a inicialização. Possíveis causas podem ser encontradas na página de manual systemd.generator. No meu caso, foi o arquivo de configuração do PostgreSQL /etc/postgresql/9.6/main/postgresql.confque foi vinculado a um sistema de arquivos diferente que ainda não estava disponível quando o gerador foi executado mais cedo durante a inicialização. postgresql-generatorverifica a existência desse arquivo, mesmo que não seja necessário.


Sinta-se livre para editar a sua resposta quando você consegue resolver o problema :)
tempestade

9

Estendendo a resposta de Tilman, mas não há elogios suficientes para comentar ...

Se você não precisar que o serviço seja chamado de postgresql e não se importe com o serviço fictício do wrapper, ele deve funcionar apenas para controlar o serviço real diretamente. Seu nome é: postgresql@$version-$cluster.service No seu caso, deve ser o postgresql-9.5-main em resumo. Gostaria de começar

systemctl start postgresql@9.5-main

e para parar:

systemctl stop postgresql@9.5-main

O status também fornecerá informações muito melhores e precisas do que no serviço de wrapper gerado automaticamente.

systemctl status postgresql@9.5-main

Para a 9.6, é assim:

● 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

No meu caso, isso estava relacionado a códigos de idioma configurados incorretamente.

Encontrei a solução nesta resposta do dba.stackexchange.com :

  1. Use sudo dpkg-reconfigure localespara gerar os locais necessários
  2. Solte o cluster de banco de dados existente via sudo pg_dropcluster 9.5 main(isso apagará todos os dados no cluster!)
  3. Recrie o cluster via sudo pg_createcluster 9.5 main --start
  4. Reinicie o PostgreSQL via sudo service postgresql restart

1

seria melhor usar scripts de inicialização do systemd com o ubuntu 16.04, os scripts init podem não funcionar corretamente atualmente. O Postgres 9.5 já está nos repositórios do ubuntu, então tente que, em vez disso, ele deve ter a inicialização do systemd.


usando ubuntu padrão repo Eu obter o mesmo resultado
mike927

isso é uma pena, parece que o pessoal do postgres ainda não pegou o jeito do systemd. Você provavelmente deve lançar um bug no pacote postgres ou perguntar na lista de discussão sobre o suporte ao systemd. Eu não uso muito o postgres, mas alguns projetos de código aberto adotaram uma postura contra o systemd ou talvez entremeados em debates internos sobre como apoiá-lo.
Amias 28/09

quando executo systemctl, ele retorna "postgresql@9.5-main.service carregado falhou com falha PostgreSQL Cluster 9.5-main". Por que falhou?
precisa saber é o seguinte

Bem, neste caso, são os scripts de inicialização do systemd que não funcionam corretamente, portanto o conselho não é exatamente útil.
Tilman

1

Outro "foi mordido por isso".

De pg_upgradeclusterfato, deixou a versão de destino (9.6) no modo "manual" na porta 5433 e a versão de origem (9.5) na porta 5432.

Mesmo depois pg_dropcluster 9.5. A edição do arquivo start.conf não ajudou, mas a dica era usar systemctl daemon-reload, pois o gerador decide com base nesse arquivo de configuração se deve ligar novamente o arquivo de serviço:

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

Portanto, se o cluster que você deseja iniciar não tiver a palavra "auto" no start.conf, será necessário recarregar o sistema (ou reiniciar) para habilitá-lo no momento da inicialização.

Ainda temos que verificar isso com uma reinicialização, mas considerando o que foi dito acima, bastante confiante de que esse era o problema.


1

Desabilitei o "super serviço" mágico assim:

root@server# systemctl disable postgresql

Então eu ativei o serviço concreto:

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

Depois de reiniciar tudo funcionou novamente.



0

Eu tive esse problema devido a um motivo diferente: permissões de diretório. Eu tinha um chmod de varredura completa como este:

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

Isso define o diretório como não executável, o que impede que o postgres o leia.


0

Eu tive esse mesmo problema ao verificar o problema encontrado com a permissão ssl-cert-snakeoil.key.

Definir propriedade

raiz do chown: ssl-cert ssl-cert-snakeoil.key chmod 640 ssl-cert-snakeoil.key

e fez uma reinicialização limpa.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.