Acabei de reinstalar o postgres via brew install postgres
Eu corri, initdb /usr/local/var/postgres -E utf8
mas consegui:
The files belonging to this database system will be owned by user "atal421".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default text search configuration will be set to "english".
initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".
então, eu fui para rm -rf
a pasta postgres e a executei novamente:
initdb /usr/local/var/postgres -E utf8
dizia que estava tudo bem:
Success. You can now start the database server using:
postgres -D /usr/local/var/postgres
então, executei esse comando e obtive:
postgres -D /usr/local/var/postgres
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 13731) running in data directory "/usr/local/var/postgres"?
Agora, quando olho para o Monitor de Atividade, vejo 6 instâncias de postgress.
Como faço para corrigir isso?
postgres
com um postmaster e cinco backends de utilitários. O PostgreSQL é uma arquitetura de múltiplos processos.Respostas:
Anúncio de serviço público: nunca exclua
postmaster.pid
. Realmente. Ótima maneira de obter corrupção de dados.Você já tinha o PostgreSQL instalado e excluiu o diretório de dados sem parar o servidor em execução. Agora você tem alguns processos órfãos do servidor PostgreSQL que gerenciam arquivos de dados que foram excluídos, para que não estejam mais acessíveis no sistema de arquivos e serão totalmente excluídos quando o último identificador de arquivo aberto for fechado. Você não pode usar
pg_ctl
para desligar o servidor normalmente, porque excluiu o datadir do cluster; portanto, você deve simplesmente matar os processos. Mate o postmaster ( não usekill -9
, apenas uma matança comum fará) e o resto também será encerrado.Você poderá iniciar um novo servidor no datadir com os
initdb
dados recentes.É altamente provável que você enfrente conflitos ao longo do caminho, a menos que desinstale a outra versão mais antiga do PostgreSQL.
Em poucas palavras:
cat /usr/local/var/postgres/postmaster.pid
Anote o número na primeira linha, que é o pid do postmaster.
Verifique se
ps
o pid é o de um postmaster do postgres.Mate o processo do postmaster com o seguinte comando, substituindo 'PID' pelo número que você anotou. Novamente, não use
kill -9
oukill -KILL
, apenas use um plainkill
, ou seja, umSIGTERM
:kill PID
Se o PID não é a de um postmaster postgres, manualmente
kill
quaisquerpostgres
backends que podem ainda estar em execução, verificar que já não estão em execução, e só então removerpostmaster.pid
. (Você também deve verificarpostmaster.pid
se não está no armazenamento compartilhado onde o servidor pode estar sendo executado em outra VM / host).fonte
kill PID
não funcionou para mim. Eu precisavakill -3 PID
. No meu caso, eu havia feito um desligamento que pode ter matado as janelas do terminal sem interromper os processos corretamente. Eleskill -3 PID
mataram o processo e seus filhos, deixando-me iniciar o postgres novamente.Outra possibilidade é que você teve um desligamento difícil e o processo do postgres morreu sem limpar o arquivo pid. Isso acontece comigo quando a bateria do meu laptop acaba.
Essa solução não é para um sistema de produção e você deve realmente garantir que o daemon do postgres não esteja em execução , mas eu uso meu laptop para codificação e não estou preocupado com a necessidade de regenerar meus bancos de dados.
Portanto, se outro processo - ou nenhum - estiver em execução nessa porta, basta excluir o arquivo pid, por exemplo
e o postgres logo iniciará bem.
Para descobrir se outro processo está em execução nessa porta, você pode fazer
Então corra
para ver se funcionou. Você deveria ver
(ou pelo menos foi o que acabei de ver depois de fazer o acima :-))
(E realmente, o Postgres não deveria ser inteligente o suficiente para perceber que não há processo com o PID 933 e remover o arquivo falso falso por conta própria?)
fonte
postmaster.pid
arquivo estava apontando. Isso ocorreu vários dias após um desligamento imundo (instalação de laptop do Postgres no OSX via homebrew).rm postmaster.pid
funcionou para mim. Não vejo corrupção de dados (mas, de qualquer forma, essa é apenas uma máquina de desenvolvimento).~/Library/Application Support/Postgres/data/postmaster.pid
eu estava novamente em funcionamento.Eu tentei tudo isso sem sucesso depois que a atualização para o Yosemite quebrou meu postgres (instalado via homebrew).
Então eu tropecei neste post do blog: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres
Primeiro, eu precisava criar os diretórios ausentes que aparentemente foram apagados durante a atualização (obrigado Apple!).
Em seguida, basta iniciar o postgres novamente usando a sequência normal de inicialização do homebrew:
Obrigado Ruckus Notes por ajudar a resolver meu problema. Espero que ajude você também.
fonte
INSTRUÇÕES DE REBOOT DIFÍCIL
Eu tive esse mesmo problema após uma reinicialização completa. Depois de verificar o
postmaster.pid
pid do arquivo, notei que não havia nenhum processo em execução. Eu não queria excluir o arquivo .pid, mas usei umpg-stop
alias que eu havia criado no meu.bash_profile
. esse apelido é executadopg_ctl -D /usr/local/var/postgres stop -s -m fast
Para referência
saída de log após
pg-stop
preparar
Também pensei em mencionar aqui que, se você instalou o postgres com homebrew, deve dar
brew services
uma olhada. Agora é assim que eu prefiro iniciar / parar meus bancos de dados.fonte
Recebi esse erro depois que, penso eu, meu computador travou. O PostgreSQL não pôde nem ser iniciado por causa desse erro, portanto, matar o processo não era a solução. Simplesmente fiz o backup e excluí o
postmaster.pid
arquivo, o erro foi interrompido e o PG pôde iniciar novamente.fonte
Às vezes, os humildes
pg_ctl -w restart
podem fazer o truque :-)fonte
/usr/pgsql/9.3/data/postmaster.pid
não estava presente no ps aux.) #Excluir postmaster.pid é realmente uma coisa decente a ser feita a cada inicialização, às cegas. É isso que meu sistema faz. Como você acabou de inicializar, sabe que não há nenhum processo do Postgres em execução e, se estiver se recuperando de um desligamento impuro, esse arquivo estará lá impedindo sua recuperação.
Um design melhor para o Postgres seria colocar o arquivo postmaster.pid no sistema de arquivos / run, para garantir a exclusão de todas as reinicializações. Muitos outros servidores funcionam dessa maneira.
fonte