Não é possível conectar ao PostgreSQL local

124

Consegui administrar meu ambiente de desenvolvimento local.

Todos os meus aplicativos Rails locais agora estão fornecendo o erro:

PGError
could not connect to server: Permission denied
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

Não tenho ideia do que causou isso.

Enquanto procurava por uma solução, atualizei todas as gemas incluídas no pacote, gemas atualizadas do sistema e MacPorts atualizados. Sem alegria

Outros relataram esse problema ao atualizar do OSX Leopard para o Lion, devido à confusão sobre qual versão do Postgres deve ser usada (por exemplo, versão do OSX ou versão do MacPorts). Estou executando o Lion há vários meses, então parece estranho que isso deva acontecer agora.

Estou relutante em mexer demais sem primeiro entender qual é o problema. Como posso depurar isso metodicamente?

Como posso determinar quantas versões do PostgreSQL estão no meu sistema, qual está sendo acessada e onde está localizada? Como faço para corrigir isso se o PostgreSQL errado estiver sendo usado?

Desculpe pelas perguntas de iniciantes. Ainda estou aprendendo como isso funciona! Obrigado por qualquer indicação.

EDITAR

Algumas atualizações com base nas sugestões e comentários abaixo.

Eu tentei executar o pg_lsclustersque retornou um command not founderro.

Tentei localmente meu arquivo pg_hba.conf e encontrei esses três arquivos de exemplo:

/opt/local/share/postgresql84/pg_hba.conf.sample
/opt/local/var/macports/software/postgresql84/8.4.7_0/opt/local/share/postgresql84/pg_hba.conf.sample
/usr/share/postgresql/pg_hba.conf.sample

Então, eu assumo que 3 versões do PSQL estão instaladas? Macports, OSX padrão e ???.

Eu fiz uma pesquisa pelo script de inicialização launchctl ps -ef | grep postgresque retornou

0    56     1   0 11:41AM ??         0:00.02 /opt/local/bin/daemondo --label=postgresql84-server --start-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper start ; --stop-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper stop ; --restart-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper restart ; --pid=none
  500   372     1   0 11:42AM ??         0:00.17 /opt/local/lib/postgresql84/bin/postgres -D /opt/local/var/db/postgresql84/defaultdb
  500   766   372   0 11:43AM ??         0:00.37 postgres: writer process                                                                                                                                                                                                                                                                                                                   
  500   767   372   0 11:43AM ??         0:00.24 postgres: wal writer process                                                                                                                                                                                                                                                                                                               
  500   768   372   0 11:43AM ??         0:00.16 postgres: autovacuum launcher process                                                                                                                                                                                                                                                                                                      
  500   769   372   0 11:43AM ??         0:00.08 postgres: stats collector process                                                                                                                                                                                                                                                                                                          
  501  4497  1016   0 12:36PM ttys000    0:00.00 grep postgres

Publiquei o conteúdo do postgresql84-server.wrapper em http://pastebin.com/Gj5TpP62 .

Tentei executar, port load postgresql184-servermas recebi um erro Error: Port postgresql184-server not found.

Ainda estou muito confuso sobre como consertar isso e aprecio qualquer indicação de "for dummies".

Obrigado!

EDIT2

Esse problema começou depois que tive alguns problemas com o daemondo. Meus aplicativos locais do Rails estavam travando com um erro de aplicativo ao longo das linhas de "daemondo gem não encontrado". Depois, passei por uma série de atualizações de pacotes, atualizações de gemas, atualizações de portas e atualizações de distribuição para tentar encontrar o problema.

Esse erro pode ser um problema do daemondo?

Andy Harvey
fonte
Observe que quando o aplicativo se conecta, ele se conecta pela porta tcp em vez do soquete do domínio unix. Então você precisa configurar o postgres para aceitar conexões de rede, pelo menos a partir do host local.
Paul Tomblin
Por que você acredita? Obviamente, os drivers estão tentando se conectar através do soquete Unix. Embora eles procurem a tomada no lugar errado.
Milen A. Radev
possível duplicata de Como resolver este erro do PostgreSQL no OS 10.6 (Snow Leopard)
a_horse_with_no_name
Exatamente. Parece ser uma coisa mac. O OP pode usar o sinalizador -h, depois de verificar se o postmaster está em execução.
### wildplasser #
Por favor, publique a saída pg_lsclusterse seu pg_hba.confarquivo.
tscho

Respostas:

66

Isso realmente parece um erro de permissão de arquivo. Soquetes de domínio Unix são arquivos e têm permissões de usuário como qualquer outro. Parece que o usuário OSX que está tentando acessar o banco de dados não possui permissões de arquivo para acessar o arquivo de soquete. Para confirmar isso, fiz alguns testes no Ubuntu e psql para tentar gerar o mesmo erro (incluído abaixo).

Você precisa verificar as permissões no arquivo de soquete e seus diretórios /vare /var/pgsql_socket. Seu aplicativo Rails (usuário OSX) deve ter permissões de execução (x) nesses diretórios (de preferência conceda permissões a todos) e o soquete deve ter permissões completas (wrx). Você pode usá-lo ls -lAd <file>para verificá-las e, se alguma delas for um link simbólico, será necessário verificar o arquivo ou direcionar o link apontado.

Você pode alterar as permissões no diretório por conta própria, mas o soquete é configurado pelo postgres in postgresql.conf. Isso pode ser encontrado no mesmo diretório que pg_hba.conf(Você precisará descobrir qual). Depois de definir as permissões, você precisará reiniciar o postgresql.

# postgresql.conf should contain...
unix_socket_directory = '/var/run/postgresql'       # dont worry if yours is different
#unix_socket_group = ''                             # default is fine here
#unix_socket_permissions = 0777                     # check this one and uncomment if necessary.

EDITAR:

Fiz uma pesquisa rápida no google, na qual você pode querer verificar se é relevante. Isso pode resultar em qualquer tentativa de findfalha no seu arquivo de configuração.

http://www.postgresqlformac.com/server/howto_edit_postgresql_confi.html


Mensagens de erro:

Usuário não encontrado em pg_hba.conf

psql: FATAL:  no pg_hba.conf entry for host "[local]", user "couling", database "main", SSL off

Falha na autenticação da senha do usuário:

psql: FATAL:  password authentication failed for user "couling"

Arquivo de soquete unix ausente:

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

Existe um soquete Unix, mas o servidor não está ouvindo.

psql: could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Permissões de arquivo incorretas no arquivo de soquete unix :

psql: could not connect to server: Permission denied
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Philip Couling
fonte
1
obrigado por essas idéias @couling. Parece a direção certa. Mas há algo muito estranho na minha configuração. Lembre-se de que isso funcionou perfeitamente até recentemente. Examinei os três diretórios do postgres no meu sistema, todos eles contêm arquivos conf.sample (pg_hba, pg_ident, pg_service, etc), mas não arquivos .conf. Este não deve ser o caso, correto? Além disso, o diretório que deve conter .s.PGSQL.5432 está vazio. Em vez disso, tenho um arquivo localizado em /private/tmp/.s.PGSQL.5432.lock. PSretorna os processos do postgres para que esteja em execução. Confuso!
Andy Harvey
Eu adicionei um link extra. Até onde eu sei, você não pode realmente ter o postgresql sem o postgresql.conf (mesmo que tenha sido renomeado). Sua primeira tarefa deve ser encontrar isso.
Philip Couling
1
Levou algum tempo para vasculhar meus diretórios e encontrar os arquivos certos, mas esse era realmente o problema. Obrigado pela resposta muito detalhada. Depois de encontrar o diretório correto, precisei definir o diretório do soquete, o diretório de dados, o arquivo hba_file e o ident_file no postgresql.conf. Obrigado!
Andy Harvey
1
Pode ajudar algumas pessoas: usei o brew para instalar o postgres em minha conta. No meu caso, verificou-se que a pasta / var / pgsql_socket / pertencia ao usuário _postgres e a alteração da propriedade para minha conta (darren) corrigiu esse problema. Não sabe por que o brew não definiu a propriedade desta pasta corretamente em primeiro lugar ...?
Darren Jensen
Obrigado couling. Não consegui conectar e configurar o diretório unix_socket_direct era a coisa certa a fazer.
Ryan Bigg
41

Meu pressentimento é que isso é (novamente) uma coisa do mac / OSX: o front-end e o back-end assumem um local diferente para o soquete do domínio unix (que funciona como um ponto de encontro ).

Lista de controle:

  • O postgres está em execução: ps aux | grep postgres | grep -v grepdeve fazer o truque
  • Onde está localizado o soquete: find / -name .s.PGSQL.5432 -ls(o soquete costumava estar em / tmp; você pode começar a procurar lá)
  • mesmo se você localizar o soquete (domínio unix), o cliente poderá usar um local diferente. (isso acontece se você misturar distribuições, ou se você tem uma distribuição instalada em algum lugar e outra instalação (por exemplo, de origem) em outro lugar), com o cliente e o servidor usando endereços de encontro diferentes .

Se o postgres estiver em execução e o soquete realmente existir, você poderá usar:

  • psql -h /the/directory/where/the/socket/was/found mydbname

(que tenta se conectar ao soquete do domínio unix)

; agora você deve receber o prompt do psql: tente\d e então \qsaia. Você também pode tentar:

  • psql -h localhost mydbname.

(que tenta se conectar ao host local (127.0.0.1)

Se essas tentativas falharem devido à autorização insuficiente, você poderá alterar o pg_hba.conf (e SIGHUP ou reiniciar). Nesse caso: verifique também os logs.

Uma pergunta semelhante: Não é possível iniciar o Postgres

Nota: Se você puder acessar o prompt do psql, a solução rápida para esse problema é apenas para alterar o seu config/database.yml, adicione:

host: localhost

ou você pode tentar adicionar:

host: /the/directory/where/the/socket/was/found

No meu caso, host: /tmp

wildplasser
fonte
1
@wildplasser obrigado pela sua resposta. Isso me fez começar na direção certa, e a resposta detalhada do couling deu a solução.
Andy Harvey
6
A adição do host: localhost ao meu database.yml corrigiu o meu problema. Obrigado :)
Automatico
1
o meu está em / privado / .... estranheza. Eu o instalei, mas este laptop estava tendo problemas muito antes. Esquisito. esse database.yml foi fundamental!
pjammer
4
Esquisito. Adicionando "localhost" ao meu database.yml também funcionou, mas por que? Eu não tinha isso antes e tudo estava funcionando bem. Mas acho que não adicionei nada ultimamente e de repente já era assim. > _ <
index
1
o truque para mim aqui foi o caminho do soquete - estava em / run not / var / run - obrigado!
Qodeninja 3/04
26

Tente desinstalar o pg gem ( gem uninstall pg) e depois reinstalá-lo - se você usar o bundler, então bundle install, caso contrário gem install pg. Além disso, verifique se o caminho seleciona a versão correta: o Lion possui uma versão do posgresql (versões anteriores não) e pode estar no caminho antes da versão instalada localmente (por exemplo, MacPorts, homebrew).

No meu caso: instalação homebrew do postgresql, postgresql atualizado, rails, etc. e, em seguida, recebi esse erro. Desinstalar e reinstalar a pg gem fez isso por mim.

Tom Harrison
fonte
8
agrupar gem exec intocada pg <== também irá fazer o truque
Ben Walding
Não tenho dúvida de que o erro do OP pode ser causado por várias coisas, mas esta é a solução que funcionou para mim.
#
20

A localização do arquivo de soquete é inserida na gema em tempo de compilação. Assim, você precisa reconstruir sua pg gem.

gem pristine pg
# or
bundle exec gem pristine pg

Isso deve resolver esse problema específico.

Ben Walding
fonte
Comecei a obter o problema descrito nesta pergunta após atualizar o Postgres do 9.1x para o 9.3x. Esta resposta o corrigiu para mim (o mesmo aconteceu com a adição de 'localhost' ao meu database.yml, mas eu gosto mais dessa abordagem).
Joshua Flanagan
16

Se você estiver recebendo um erro semelhante:

psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

Isso pode fazer o truque (fez para mim):

initdb /usr/local/var/postgres -E utf8

O diretório especificado deve ser diferente se você não estiver usando o OSX / Brew.

Nota: Esta não é a mensagem de erro exata vista acima, mas esse encadeamento é o primeiro resultado dessa mensagem de erro.

Neal
fonte
6
Eu sempre acabo tendo esse problema de vez em quando, mas é a primeira vez que o resolvo com ESTA solução. Além disso, teve que rm -fr /usr/local/var/postgresantes de executarinitb
Raf
1
Depois que fiz isso (tanto no Neal quanto no Raf), obtive o erro "Fatal" no banco de dados que não existe. Então, executei "rake db: create: all" e "rake db: migrate" e, finalmente, tudo funcionou novamente.
Deborah
Eu também tive que fazer rm -rf /usr/local/var/postgresentão initdb /usr/local/var/postgres -E utf8. Mas certifique-se de que o postgres não esteja sendo executado quando você fizer isso, caso contrário, o diretório será recriado quase imediatamente.
Josh W Lewis
8

o que resolveu esse erro para mim foi excluir um arquivo chamado postmaster.pid no diretório postgres. consulte minha pergunta / resposta usando o link a seguir para obter instruções passo a passo. meu problema não estava relacionado às permissões de arquivo:

psql: não foi possível conectar ao servidor: nenhum arquivo ou diretório (Mac OS X)

as pessoas que responderam a essa pergunta perderam muito jogo, obrigado por isso! votei tudo o que pude

Dragão de fogo
fonte
Como a resposta aceita aqui observa um problema de permissão de arquivo, parece aparente que sua postagem e esta não estão relacionadas.
Andrew Barber
7

Foi assim que resolvi a mensagem de erro, parcialmente baseada na resposta do wildplasser.

find / -name .s.PGSQL.5432 -ls 2> /dev/null
  => ... /tmp/.s.PGSQL.5432

Portanto, existe meu soquete ou o que seja, mas o cliente procura:

/var/run/postgresql/.s.PGSQL.5432

Simplesmente faça um link simbólico para /tmp/.s.PGSQL.5432:

sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

Espero que isso ajude a alguém. Parece meio errado, mas ei, funciona!

Frans
fonte
1
Isso funcionou para mim: sudo ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/.s.PGSQL.5432
ardochhigh
Thanx :) Isso ajudou. Mas antes de criar o link simbólico, não esqueça de criar a sudo mkdir /var/run/postgresqlpasta (no meu caso, o id não existia e não foi criado pelo instalador para a página 9.3.X).
kovpack
2
Ah, essa solução acabou sendo uma solução única que eu tive que refazer após cada reinicialização. Para o Rails, encontrei outra solução - modifique o arquivo de configuração do banco de dados (resposta adicionada abaixo).
Kevpack
6

Comecei a obtê-lo depois de atualizar para um novo postgres - não sabia que tinha arquivos de dados em espera.

Primeiro, tentei iniciar o servidor postgres:

postgres -D /usr/local/var/postgres

foi assim que vi esse erro

FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.0, which is not compatible with this version 9.3.5.

Então, encontrei esta resposta no SO - relacionada a um erro de incompatibilidade: /server/342626/how-do-i-upgrade-postgresl-database-incompatibility-error

Foi isso que consertou

mv /usr/local/var/postgres /usr/local/var/postgres.old
initdb -D /usr/local/var/postgres
Mark Swardstrom
fonte
4

Apenas confirmando que eu tive um problema semelhante no PSQL e Django,

Parecia que meu servidor psql não foi desligado corretamente e o arquivo postmaster.pid ainda estava presente (deve ser excluído automaticamente no desligamento adequado) na minha pasta postgres.

Excluído isso e tudo de bom

comprar
fonte
2
Foi isso que resolveu o problema para mim. Meu computador congelou e tive que fazer um desligamento rígido. Quando iniciei o backup, o postgres dizia que psql: could not connect to server: No such file or directory.Remover postmaster.pidde /usr/local/var/postgrestudo fazia funcionar novamente.
Ryan Epp
1
Foi também o que aconteceu comigo. Meu mac foi reiniciado devido a um pânico no kernel e eu tive que excluir o postmaster.pid antes de voltar ao trabalho.
214 Ben
4

Eu estava recebendo o mesmo erro (verifica-se que houve um erro postmaster.pid. Veja como eu coloquei o postgres em funcionamento novamente ( crédito a Ricardo Burillo pela correção ):

$ rm /usr/local/var/postgres/postmaster.pid 
$ pg_resetxlog -f /usr/local/var/postgres
respondercriar
fonte
Isso funcionou para mim, embora o pg_resetxlogarquivo de bloqueio "postmaster.pid" retornado exista.
Elise
3

Eu tive um problema semelhante ao tentar usar o postgresql com trilhos. A atualização do meu Gemfile para usar a nova versão do gem pg resolve esse problema para mim. (gem pg versão 0.16.0 funciona). No uso do Gemfile:

gem 'pg', '0.16.0'

em seguida, execute o seguinte para atualizar a gema

bundle install --without production
bundle update
bundle install
andr3wll
fonte
1
Isso corrigiu o problema para mim também. Eu estava no 0.15.1 do Rails 4.0 beta e agora usando o Ruby 2.0.0. Depois de atualizar para a página 0.16.0, o problema foi corrigido.
Bratche
Resolvido o problema para mim em 4.1.0.beta1
Andreas
3

Eu li muitos tópicos sobre esse erro e a solução para mim foi simplesmente reiniciar o postgres com:

sudo service postgresql restart

O que não é mencionado aqui.

ToTenMilan
fonte
3
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

Estou procurando a solução por um tempo. Portanto, este também corrigiu o problema para mim (reinit db):

rm -r /usr/local/var/postgres  
initdb /usr/local/var/postgres -E utf8  
pg_ctl -D /usr/local/var/postgres -l logfile start

Eu uso o OS X 10.11.3 com o brew.

Alexander Svetly
fonte
2

Isso aconteceu comigo hoje depois que a bateria do meu Macbook morreu. Eu acho que isso pode ser causado por um desligamento inadequado. Tudo o que você precisa fazer em casos como o meu é excluir postmaster.pid

Navegue até a pasta

cd /usr/local/var/postgres

Verifique se postmaster.pid está presente

ls

Remover postmaster.pid

rm postmaster.pid
Aaron
fonte
2

No meu caso, nenhuma das soluções anteriores foi boa. Em vez de usar o soquete, você pode usar o número TCP host+ portno arquivo de configuração do Rails. Portanto, no database.ymlarquivo, adicione duas linhas como aqui:

...
adapter: postgresql
encoding: unicode
pool: 5
host: localhost
port: 5432

Isso resolveu meu problema :)

Antes de usar essa correção:

sudo mkdir /var/run/postgresql
sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

Mas após cada reinicialização /tmp/.s.PGSQL.5432foi excluída e eu tive que repetir esses comandos. A solução funciona, mas é horrível, então é melhor modificar o arquivo de configuração do banco de dados Rails :)

kovpack
fonte
2

Este erro ocorreu quando eu estava configurando o Posgtres com o Django, estou usando o Back Track e ele vem com o Postgres instalado. Presumo que as configurações sejam o problema. Corrigi-o removendo-o completamente e reinstalando-o assim.

sudo apt-get remove postgresql
sudo apt-get purge postgresql

Agora execute:

apt-get --purge remove postgresql\*

para remover tudo PostgreSQL do seu sistema. Apenas limpar o pacote do postgres não é suficiente, pois é apenas um meta-pacote vazio.

Depois que todos os pacotes do PostgreSQL forem removidos, execute:

rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

Agora você deve ser capaz de:

apt-get install postgresql

fonte
1

MacOSX aqui. Eu tive o mesmo problema depois de atualizar minha instalação postresql de uma pré-9.1 para 9.1.2 usando homebrew. (A propósito, lembre-se de despejar bancos de dados antes da atualização com pg_dump, os bancos de dados anteriores à 9.1 são incompatíveis.) Mesmo problema, mesmas mensagens de erro.

Desinstalar a pg gem fez o truque para mim. Na verdade, eu tive que dançar um pouco para descobrir o problema. Primeiro, eu fiz uma desinstalação global de gemas, limpando o baralho de todas as joias antigas (havia algumas). Em seguida, removi a página do meu Gemfile, recompensei, restaurei a referência da página e recuperei novamente.

Depois disso, funcionou como um encanto.

wizardwerdna
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ê deseja 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
0

Eu tive esse problema me atormentando e, após uma investigação mais aprofundada (em execução rake db:setup), vi que o rails estava tentando se conectar a uma instância do postgres usada anteriormente - uma que era armazenada nas variáveis ​​env como DATABASE_URL.

O conserto: unset DATABASE_URL

fonte: https://stackoverflow.com/a/17420624/2577622

adrichman
fonte
0

Tentei a maioria das soluções para esse problema, mas não consegui funcionar.

Eu executei o lsof -P | grep ':5432' | awk '{print $2}'que mostrava o PID do processo em execução. No entanto, eu não poderia matá-lo comkill -9 <pid> .

Quando eu corri, pkill postgresqlo processo finalmente parou. Espero que isto ajude.

Colin Walker
fonte
0
gem uninstall pg

No OS X com Homebrew:

gem install pg -- --with-pg-config=/usr/local/bin/pg_config
faixa
fonte