Erro do PostgreSQL 'Não foi possível conectar ao servidor: esse arquivo ou diretório não existe'

136

Como alguns outros, estou recebendo esse erro ao executar o rake db: migrate no meu projeto ou até mesmo tentar a maioria das tarefas de banco de dados para meus aplicativos Ruby on Rails 3.2.

PGError (não foi possível conectar ao servidor: não existe esse arquivo ou diretório. O servidor está executando localmente e aceitando conexões no soquete de domínio Unix "/tmp/.s.PGSQL.5432"?

Instalei o PostgreSQL com o Homebrew há muito tempo e, após uma tentativa de instalação do MongoDB recentemente, minha instalação do PostgreSQL nunca foi a mesma. Estou executando o OS X versão 10.6 Snow Leopard.

O que há de errado e como entendo melhor como o PostgreSQL é e deve ser configurado no meu Mac?

Até agora (eu acho) isso me diz que o PostgreSQL não está executando (?).

ps -aef|grep postgres                                                                                                   (ruby-1.9.2-p320@jct-ana) (develop) 
  501 17604 11329   0   0:00.00 ttys001    0:00.00 grep postgres

Mas isso me diz que o PostgreSQL está em execução?

 launchctl load -w /usr/local/Cellar/postgresql/9.1.4/homebrew.mxcl.postgresql.plist                                                        (ruby-1.9.2-p136) 
homebrew.mxcl.postgresql: Already loaded

Como faço para corrigir isso? o que não estou vendo?

PS: ~/Library/LaunchAgentsinclui dois arquivos .plist do PostgreSQL. Não tenho certeza se isso é relevante.

org.postgresql.postgres.plist
homebrew.mxcl.postgresql.plist

Eu tentei o seguinte e obtive um resultado como abaixo.

$ psql -p 5432 -h localhost

psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (fe80::1) and accepting
    TCP/IP connections on port 5432?

Eu li que isso está ocorrendo porque o OS X instala sua própria versão do PostgreSQL e o Homebrew instala uma versão diferente em um local diferente e os comandos do PostgreSQL estão procurando no diretório / tmp /. Você precisará pesquisar mais sobre o Stack Overflow, mas basicamente vinculará o PostgreSQL para que qualquer coisa que procure nesse caminho tmp encontre o caminho real, se isso fizer sentido.

Este é o link em que encontrei mais algumas coisas para tentar, especificamente fazendo o link simbólico conforme descrito acima, o Mac OSX Lion Postgres não aceita conexões em /tmp/.s.PGSQL.5432 . Eu ainda gostaria que alguém reunisse uma explicação decente dos conceitos por trás da instalação do PostgreSQL no OS X e por que tudo é tão difícil.

Informações mais recentes para ajudar na solução de problemas:

$ which psql // This tells you which PostgreSQL you are using when you run $ psql. 

Então corra:

$ echo $PATH

O principal a levar em conta é o seguinte:

Certifique-se de que a entrada do caminho para a cópia do PostgreSQL que você deseja executar seja apresentada ANTES do caminho para o PostgreSQL do sistema OS X.

Este é um requisito essencial que decide qual PostgreSQL será executado e é o que me disseram que leva à maioria desses problemas.

Evoluir
fonte
Você já encontrou uma solução para isso? Vejo que você não marcou um. Nada disso me ajuda também.
Andras Gyomrey
Ainda é principalmente vodoo e encarnações estranhas para fazê-lo funcionar. Acabei de adicionar [Editar 2] acima com um link com mais algumas sugestões e como fazer o link simbólico de acordo com meus comentários de edição. O Symlink funcionou para mim no final, mas acho que também desinstalei e reinstalei o postgres e o homebrew lá no caminho, tão difícil de saber exatamente o que fez a diferença. Boa sorte. Relate se você descobrir algo novo, com 15.000 visualizações sobre essa questão, é algo que causa muita dor nas pessoas!
Evolve
@AndrasGyomrey Acabei de voltar do RailsCamp15 na Austrália e as pessoas disseram que a chave era acertar o arquivo do caminho, eu editei no Edit 3 acima para explicar isso.
Evolve
Lembre-se de que o launchctl relatando algo como carregado NÃO significa necessariamente que está funcionando. Você deve dar uma olhada no bigsql.com como uma alternativa; funciona no Mac e tem uma boa interface de gerenciamento.
Jim Nasby

Respostas:

102

Verifique se não há postmaster.pid no diretório postgres, provavelmente /usr/local/var/postgres/

remova isso e inicie o servidor.

Check - https://github.com/mperham/lunchy é um ótimo wrapper para o launchctl.

Hass
fonte
3
Isso funcionou para mim. Acabei de instalar o yosemite e carreguei o postgres do homebrew. Funcionou bem na primeira vez em que o usei, mas tive esse problema após uma reinicialização. Então, você pode explicar por que isso funcionou?
Dan Williams
2
funcionou para mim, mas para newbs, alguém pode explicar por que e como isso é seguro
Alexander Mills
58

" Postgres.app " é uma correção melhor se você estiver no OS X


Aqui está a correção:

  1. Pare o banco de dados
  2. cd /var
  3. rm -r pgsql_socket
  4. ln -s /tmp pgsql_socket
  5. chown _postgres:_postgres pgsql_socket
  6. Reinicie o PostgreSQL (não o seu computador)

Mais informações estão disponíveis em " postgresql 9.0.3. No Lion Dev Preview 1 ".

josephmisiti
fonte
2
Erros de volta para mim e essa correção não ajudou. Eu sinto que estou pulando em um quarto escuro, trabalhando para entender o que realmente está acontecendo e um processo para me aplicar uma correção. Seria possível você explicar como eu poderia diagnosticar e corrigir esse problema?
Evolve
Funciona para mim. Se sente um pouco estranho para chown /tmppara _postgres, mas hey :)
wrdevos
O postgresapp funciona, mas por que não consigo iniciar meu servidor no terminal? Depois de sair deste aplicativo, o problema volta como esperado.
hakunami
Isso funcionou para mim, mas observe que você deve ser root ou usar o sudo para executar os números 2 a 4. Além disso, esclareça a etapa 5 - você só precisa reiniciar o postgres, não o computador.
mpelzsherman
2
Letras maiúsculas não dão uma resposta melhor. Ainda é perfeitamente aceitável instalar e executar o Postgres através do Homebrew (serviços.)
Drenmi
55

Para mim, isso funciona

rm /usr/local/var/postgres/postmaster.pid
tsunllly
fonte
9
No meu caso, depois de eliminar o pid, eu precisava para reiniciar o PostgreSQL compg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
Obromios
4
Eu também tive que reiniciar o postgres, quando instalado pelo homebrew, você pode fazer assim:brew services restart postgresql
santuxus
2
Estou em env janela de encaixe No such file or directoryno meu caso
Sarz
2
rm: /usr/local/var/postgres/postmaster.pid: Não
existe
13

Isso funcionou para mim pelo erro que você mencionou. Siga um destes procedimentos:

  1. É possível alterar a porta padrão especificada no postgres.confarquivo, se você tiver usado algo diferente da porta padrão 5432durante a instalação.

  2. Altere o número da porta postgresql.confe reinicie o servidor DB.

  3. Em vez de psqldigitar o comando completo:

    psql -p 5432 -h localhost   
    • nome do servidor e a porta não
solaimuruganv
fonte
1. Acho que minha instalação teria sido de acordo com os padrões.
Evolve
2. Eu poderia mudar isso, alguma implicação em mudar a porta?
Evolve
3. Adicionado minha saída de 3 acima.
Evolve
A opção 3 funcionou com porta personalizada. Como tenho vários servidores pg instalados (PostgreSQL 9.1, 9.2 e 9.3), também tive que apontar para o psql certo.
Gpasse 27/08
11

Se você estiver executando o Homebrew, desinstale o Postgresql end pg gems: *

$ gem uninstall pg
$ brew uninstall postgresql

Faça o download e execute o seguinte script para corrigir a permissão em / usr / local: * https://gist.github.com/rpavlik/768518

$ ruby fix_homebrew.rb

Em seguida, instale o Postgres novamente e pg gem: *

$ brew install postgresql  
$ initdb /usr/local/var/postgres -E utf8

Para que o launchd inicie o postgresql no login, execute:

$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents 

Ou comece manualmente.

Instalar pg gem

$ gem install pg

Espero ter ajudado

Fabricio
fonte
De brew info postgres:ARCHFLAGS="-arch x86_64" gem install pg
wrdevos 27/05
1
isso não excluiria os registros no banco de dados?
kibaekr
initdb /usr/local/var/postgres -E utf8trabalho. Muitíssimo obrigado.
Chris Jeon
8

Eu tive esse problema quando atualizei o Postgres para 9.3.x. A solução rápida para mim foi fazer o downgrade para a versão 9.2.x que eu tinha antes (não é necessário instalar uma nova).

$ ls /usr/local/Cellar/postgresql/
9.2.4
9.3.2
$ brew switch postgresql 9.2.4
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
<open a new Terminal tab or window to reload>
$ psql

O " Homebrew instala uma versão específica da fórmula? " Oferece uma explicação muito mais abrangente, além de maneiras alternativas de corrigir o problema.

Silvenon
fonte
Obrigado pela contribuição e instruções claras para repetir sua correção. Esse link que você incluiu é abrangente. No momento, não estou tendo problemas com o postgres, por isso não tenho certeza do quanto isso é útil para outras pessoas, mas para qualquer outra pessoa, se você achar isso útil, comente aqui.
Evolve
Acho útil e relevante, embora talvez não diretamente. Ele resolveu o problema apenas alternando versões, usando o brew, que é uma ferramenta bastante comum, e apenas repetiu as etapas, até agora, ótimo, o link aborda mais problemas específicos do brew, no entanto, para que eu possa ver seus questionamentos sobre o valor no contexto da pergunta do PO.
Wkhatch
7

Corrigi isso atualizando o postgres.

brew update
brew upgrade

Também tive que atualizar os bancos de dados para serem compatíveis com a nova versão principal, porque atualizei de 10 para 11.

brew postgresql-upgrade-database

(fonte https://github.com/facebook/react-native/issues/18760#issuecomment-410533581 )

Nelu
fonte
Eu recebi este erro Erro: Nenhuma versão do postgresql 9.3. * Instalada!
nourza 5/04
5

Portanto, para muitos dos problemas aqui, parece que as pessoas já estavam executando o psql e tiveram que removê-lo postmaster.pid. No entanto, eu não tive esse problema, pois nunca tive o postgres instalado corretamente no meu sistema.

Aqui está uma solução que funcionou para mim no MAC OSX Yosemite

  1. Eu fui a http://postgresapp.com/ e baixei o aplicativo.
  2. Mudei o aplicativo para o diretório Application /
  3. Adicionei-o ao $ PATH adicionando-o a .bashrc ou .bash_profile ou .zshrc: export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/latest/bin
  4. Eu executei o postgres no diretório Applications e executei o comando novamente e funcionou.

Espero que isto ajude! Toodles!

Além disso, esta resposta me ajudou muito: https://stackoverflow.com/a/21503349/3173748

superjisan
fonte
Isso não aponta para o aplicativo Postgres, e não para a instalação de distribuição? Que podem cortá-lo fora de alguns pacotes de votos (pgrouting por exemplo, que você não pode instalar para o aplicativo Postgres que me causou tristeza sem fim e aqui estou agora)
allthesignals
4

Quando você executa: psql -p 5432 -h localhost, ele não usa o driver de loopback, mas usa um soquete real e, portanto, você precisa configurar o postgres para aceitar as conexões do soquete. Portanto, mesmo que o pgadmin e outros clientes possam funcionar, o psql não funcionará.

Você precisa alterar os arquivos postgresql.conf e pg_hba.conf para permitir a conexão através de um soquete real. Isso também permitirá a conexão de um ip remoto, motivo pelo qual está desativado por padrão.

Esses arquivos estão no diretório de dados, mas o local real pode ser diferente dependendo de como o postgres foi instalado. Com o postgres em execução, execute o comando:

ps -ef | grep postmaster

Esses dois arquivos são o diretório -D (talvez / usr / local / pgsql / data).

Para o arquivo postgresql.conf, remova o comentário do endereço de escuta e mude para:

listen_address = '*'

Para o pg_hba.conf, adicione a linha:

host all all 0.0.0.0/0 md5
oenpelli
fonte
2

Eu realmente não conheço Mac ou Homebrew, mas conheço muito bem o PostgreSQL.

Você quer descobrir de onde os logs do PostgreSQL estão tentando iniciar e qual é o diretório do soquete do PostgreSQL. Por padrão, quando você cria o PG, o diretório do soquete é / tmp /. Se você não alterou isso quando criou o PG e iniciou o PG, poderá ver um arquivo de soquete em / tmp se fizer: ls -al / tmp

O arquivo de soquete começa com um ".", Portanto você não o verá com o '-a' para ls.

Se você não vê um soquete lá e não vê nada do ps awux | grep postgres, o PG provavelmente não está em execução, ou talvez esteja, e é o instalado pelo OSX. O que pode estar acontecendo é que você pode estar tendo um conflito ao ouvir na porta 5432 no host local - use netstat -anp para ver o que está ouvindo no 5432. Se um PG do Mac OSX já estiver ouvindo nessa porta, isso poderá ser o problema.

Espero que ajude. Ouvi dizer que o homebrew pode tornar as coisas um pouco feias e muitas pessoas com quem conversei para incentivar o uso de uma VM.

Stephen Frost
fonte
Obrigado por contribuir com isso. Se isso lhe der um pouco mais de experiência, o homebrew simplesmente executa esse script ao instalar o postgres. github.com/Homebrew/homebrew-core/blob/master/Formula/… Espero que você dê uma olhada e, possivelmente, compartilhe outras idéias do que encontrou. O que eu acho que as pessoas precisam é de uma maneira mais fácil de depurar por que estão recebendo esse erro para que saibam que ação tomar.
Evolve
Com base no que posso entender desse script, existe um "postgres.log" em um diretório "var", possivelmente em HOMEBREW_PREFIX. Esse arquivo de log conterá informações sobre o PG que está tentando iniciar (incluindo se ele falhou ao iniciar por algum motivo). Aqui está um exemplo de mensagem mostrando o PG falhando ao iniciar devido a outro processo escutando na porta 5432:
Stephen Frost
2016-12-19 09: 11: 59.582 EST [20669] LOG: não foi possível vincular o soquete IPv4: Endereço já em uso 2016-12-19 09: 11: 59.582 EST [20669] DICA: Outro postmaster já está em execução na porta 5432 ? Caso contrário, aguarde alguns segundos e tente novamente. 2016-12-19 09: 11: 59.582 EST [20669] AVISO: não foi possível criar soquete de escuta para "localhost" 2016-12-19 09: 11: 59.582 EST [20669] FATAL: não foi possível criar nenhum soquete TCP / IP 2016 -12-19 09: 11: 59.582 EST [20669] LOG: o sistema de banco de dados está desligado
Stephen Frost
Além disso, parece que o script não altera o diretório de soquete padrão, portanto deve ser / tmp /. Você pode procurar no diretório de dados PG (que parece ser {HOMEBREW_PREFIX} / var / postgres) o arquivo postgresql.conf e procurar "unix_socket_directories". Ele é comentado por padrão, mas tem o padrão definido, por exemplo:
Stephen Frost
#unix_socket_directories = '/ tmp' # lista de diretórios separados por vírgula
Stephen Frost
2

Encontrei este erro ao executar no Mac 10.15.5 usando o homebrew.

Existe um arquivo chamado postmaster.pid que deve ser excluído automaticamente quando o postresql sai.

Se não fizer o seguinte

  • serviços de fermentação param o postgresql <--- Falha ao sair antes que a rm possa corromper o db
  • sudo rm /usr/local/var/postgres/postmaster.pid
RobKohr
fonte
1

Uma razão para você receber esse erro é que o banco de dados local do postgres é encerrado quando você reinicia o computador. Em uma nova janela do terminal, basta digitar:

$psql -h localhost 

para reiniciar o servidor.

Pstrazzulla
fonte
1

Olá mundo :)
A melhor, mas estranha, maneira para mim foi fazer as próximas coisas.

1) Faça o download do postgres93.app ou outra versão. Adicione este aplicativo à pasta / Applications /.

2) Adicione uma linha (comando) ao arquivo .bash_profile(que está no meu diretório pessoal):

exportar PATH = / Aplicativos / Postgres93.app / Conteúdo / MacOS / bin /: $ PATH
É um CAMINHO para psqlpartir Postgres93.app. A linha (comando) é executada toda vez que o console é iniciado.

3) Inicie a Postgres93.apppartir da /Applications/pasta. Inicia um servidor local (a porta é "5432" e o host é "localhost").

4) Depois de todas essas manipulações, fiquei feliz em executar $ createuser -SRDP user_namee outros comandos e ver que funcionava! Postgres93.apppode ser feito para executar sempre que o sistema for iniciado.

5) Além disso, se você quiser ver seus bancos de dados graficamente, você deve instalar PG Commander.app. É uma boa maneira de ver seu banco de dados do postgres como bonitas tabelas de dados

Obviamente, é útil apenas para o servidor local. Ficarei feliz se essas instruções ajudarem outras pessoas que enfrentaram esse problema.

crazzyaka
fonte
1

Eu tinha o PostgreSQL 9.3 e obtive o mesmo erro,

Não foi possível conectar ao servidor: Conexão recusada O servidor está executando no host "localhost" (127.0.0.1) e aceitando conexões TCP / IP na porta 5432?

Corrigi isso usando:

chmod 777  /var/lib/pgsql/9.3/data/pg_hba.conf 
service postgresql-9.3 restart

Funciona para mim.

Mahesh Shitole
fonte
Este arquivo não existe para mim
allthesignals 15/02
1

pelo que vale, experimentei o mesmo erro quando tive um erro de digitação (em md4vez de md5) no meu pg_hba.confarquivo ( /etc/postgresql/9.5/main/pg_hba.conf)

Se você chegou aqui como eu, verifique o arquivo uma vez para garantir que não haja nada de ridículo.

Zach Lamberty
fonte
onde está o pg_hba.confarquivo?
bubakazouba
1
/etc/postgresql/{postgres_version}/main/pg_hba.conf
Aidan Melen
0

Pode haver problemas diferentes com a execução local do PostgreSQL. Eu recomendaria limpar todas as versões do postgres instaladas e começar do zero. Depois de instalá-lo, é muito fácil recriar seu banco de dados se você tiver seu projeto de trilhos com as informações atualizadas.db/schema.rb

Aqui está como eu costumo instalar o PostgreSQL em um Mac . Se você estiver executando seu banco de dados no usuário raiz localmente, convém omitir a última etapa que cria um todousuário

Alex Tamoykin
fonte
0

Uma das razões pode ser que

unix_socket_directories no arquivo postgresql.conf não está listado no diretório que está procurando.

No exemplo da pergunta, ele está procurando pelo diretório / tmp, que deve ser fornecido no arquivo postgresql.conf

algo assim:

unix_socket_directories = '/var/run/postgresql,/tmp'    # comma-separated list of directories

Esta solução funcionou para mim.

Kiran K Telukunta
fonte
0

Se você está no MacOS e usa o homebrew, achei esta resposta extremamente útil:

https://stackoverflow.com/a/27708774/4062901

Para mim, meu servidor estava em execução, mas devido a uma atualização eu estava tendo problemas para conectar (nota: eu uso serviços de preparação). Se o Postgres estiver em execução, tente cat /usr/local/var/postgres/server.logver o que os logs dizem. Meu erro foi uma migração, não um problema de conexão.

Também após a migração manual que eles propõem (o que funciona, mas) eu descobri que não havia mais uma tabela para o meu usuário. Tente este comando para corrigir isso: createdb(respondido via psql: FATAL: o banco de dados "<usuário>" não existe )

rickrizzo
fonte
0

Basta reiniciar o Postgres assim que o erro aparecer executando brew services restart postgresqle tente novamente

Kanke
fonte
0

para mim, o comando rm /usr/local/var/postgres/postmaster.pidnão funcionou porque instalei uma versão específica do postgresql com o homebrew.

o comando certo é rm /usr/local/var/postgres@10/postmaster.pid.

então brew services restart postgresql@10.

ZinkLu
fonte
-5

É muito simples. Adicione apenas host ao seu arquivo database.yaml.

Ricardo - Nextv
fonte
host: 127.0.0.1 ou host: localhost, por exemplo.
precisa saber é o seguinte
Todo mundo adora uma solução simples. Mas como isso funciona? Como eu disse nos meus comentários acima, pesquisar sobre isso me levou a muitos caminhos complexos. Você pode elaborar um pouco e nos fornecer um pouco mais de histórico sobre o que realmente vê o problema e como essa simples alteração soluciona o problema. Obrigado por contribuir com este! :)
Evolve
A diferença é que, com uma conexão IP, não há como se preocupar com a localização do arquivo de soquete; em vez disso, você se preocupa com o endereço IP.
Jim Nasby