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?

mike927
fonte
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 [email protected] 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.

Tilman
fonte
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 [email protected]

e para parar:

systemctl stop [email protected]

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

systemctl status [email protected]

Para a 9.6, é assim:

[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.
fonte
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
Florian Brucker
fonte
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.

Amias
fonte
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 "[email protected] 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.

Melvyn Sopacua
fonte
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 [email protected] 

Depois de reiniciar tudo funcionou novamente.

guettli
fonte
0

Teve o mesmo erro, horas perdidas, solução simples. Verifique esta questão SO e minha resposta, que é:

sudo service postgresql restart
ToTenMilan
fonte
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.

seequ
fonte
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.

Sudharsan Punniyakotti
fonte