Executa uma instância do PostgreSQL localmente

3

Estou tentando seguir este tutorial , mas no começo ele diz para executar um postgresql instância "localmente" em vez de como um daemon usando os seguintes comandos.

$ initdb pg
$ postgres -D pg &
$ createdb shouter

Então eu tenho uma nova instalação 12.04 (VMWare no Win7, se isso importa) e fiz sob o meu login:

$ sudo apt-get install postgresql
$ initdb pg
$ postgres -D pg

Isso me dá um erro dizendo:

LOG:  could not bind IPv4 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
WARNING:  could not create listen socket for "localhost"
FATAL:  could not create any TCP/IP sockets

Eu acho que isso significa que instalar o servidor fez com que ele executasse o daemon automaticamente. Eu prefiro apenas executar na porta padrão como no tutorial, mas eu tentei executar uma porta diferente de qualquer maneira:

$ postgres -D pg -p 5555
FATAL:  could not create lock file "/var/run/postgresql/.s.PGSQL.5555.lock": Permission denied

Eu segui vários outros exemplos de maneiras diferentes de instalar o postgresql, mas todos sem sucesso. Como faço para passar este erro para que postgres -D pg possa executar com sucesso?

* note Estou perfeitamente disposto a criar uma nova VM, por isso, se você tiver instruções sobre como fazer isso com uma nova instalação, isso será ótimo.

    
por Dax Fohl 14.05.2012 / 19:03

2 respostas

3

Então, a primeira coisa é parar o servidor. Isso é feito da seguinte forma:

sudo /etc/init.d/postgresql stop

Isso foi bastante fácil. Então o resto é permissões, então aparentemente chmod é a solução na etapa 3 abaixo. (Novatos google chmod para alguma introspecção). Você tem que permitir acesso de gravação para todos os usuários ao "diretório de soquete". Aparentemente, isso é apenas um problema do Debian; eles modificaram o código fonte do postgresql em seu repositório; o "diretório socket" na fonte postgres não modificada é "/ tmp", que tem por padrão as permissões de gravação livre. No entanto, a distro Debian mudou isso para "/ var / run / postgresql", que é somente leitura para não-proprietários. Então você só tem que fazer isso gravável. Aqui está o script completo de instalação do tutorial de uma virgem 12.04 Ubuntu VM.

sudo apt-get install postgresql
sudo /etc/init.d/postgresql stop
sudo chmod a+w /var/run/postgresql
echo 'PATH=$PATH:/usr/lib/postgresql/9.1/bin' >> .bashrc
. .bashrc

sudo apt-get install leiningen

mkdir clojure
cd clojure
lein new shouter
cd shouter
gedit project.clj
  change to https://devcenter.heroku.com/articles/clojure-web-application

initdb pg
postgres -D pg &
createdb shouter
export DATABASE_URL=postgresql://localhost:5432/shouter
lein repl

Para impedi-lo de iniciar automaticamente na porta 5432: Edite o arquivo /etc/postgresql/9.1/main/start.conf .

    
por Dax Fohl 15.05.2012 / 22:37
2

Supondo que você não tenha acesso de administrador no computador, a solução é executar o Postgres com um novo arquivo de configuração e informá-lo para criar o soquete unix em um diretório onde você já tem permissão de gravação.

Inicialize um novo diretório de dados, aqui chamado db .

initdb -D db

Edite o arquivo de configuração db/postgresql.conf . Encontre a linha que especifica o unix_socket_directories e altere-o, por exemplo, para o diretório atual (que seria o diretório de dados chamado db, não o diretório a partir do qual você está executando o postgres)

unix_socket_directories='.'

Agora você pode executar o Postgres com

postgres -D db

e crie um primeiro banco de dados, fornecendo um caminho de arquivo absoluto para o soquete unis na opção -h

createdb -h 'pwd'/. customers

Você também pode querer alterar a porta padrão, seja na configuração, ou executando postgres com algo como -p 5555

A descrição da conexão em seu programa será, por exemplo,

(def psql
  {:subprotocol "postgresql"
   :subname "//localhost/shouter"})

Se você mudou a porta do padrão 5433, você deve especificá-la, algo como "//localhost:5555/shouter" .

Como uma nota lateral, o driver JDBC não suporta conectar-se ao banco de dados via sockets Unix, somente através de soquetes TCP / IP.

fonte: link

    
por user7610 21.10.2014 / 22:45

Tags