“FATAL: arquivo de bloqueio” postmaster.pid “já existe”

68

Acabei de reinstalar o postgres via brew install postgres

Eu corri, initdb /usr/local/var/postgres -E utf8mas 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 -rfa 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?

AdamT
fonte
Você provavelmente vê uma instância de postgrescom um postmaster e cinco backends de utilitários. O PostgreSQL é uma arquitetura de múltiplos processos.
Craig Ringer

Respostas:

104

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_ctlpara desligar o servidor normalmente, porque excluiu o datadir do cluster; portanto, você deve simplesmente matar os processos. Mate o postmaster ( não use kill -9, apenas uma matança comum fará) e o resto também será encerrado.

Você poderá iniciar um novo servidor no datadir com os initdbdados 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 pso 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 -9ou kill -KILL, apenas use um plain kill, ou seja, umSIGTERM :

kill PID

Se o PID não é a de um postmaster postgres, manualmente killquaisquer postgresbackends que podem ainda estar em execução, verificar que já não estão em execução, e só então remover postmaster.pid. (Você também deve verificar postmaster.pidse não está no armazenamento compartilhado onde o servidor pode estar sendo executado em outra VM / host).

Craig Ringer
fonte
isso funcionou para mim!
Tone
Isso funciona. Tive um problema em que esvaziei meu lixo e parece que alguns arquivos de dados provavelmente estavam lá ... não sei como, mas estavam. Depois que eu matei o antigo processo, funcionou bem.
Dan L
sim. isso foi no local.
Amos Folarin
7
Deve-se mencionar que após uma falha grave o arquivo PID pode sobreviver enquanto o processo morre. Nesse caso, o PID no arquivo PID pode apontar para um processo que não tem nada a ver com o Postgres. Veja a segunda resposta para esse caso.
Febeling 31/05
2
Uma planície kill PIDnão funcionou para mim. Eu precisava kill -3 PID. No meu caso, eu havia feito um desligamento que pode ter matado as janelas do terminal sem interromper os processos corretamente. Eles kill -3 PIDmataram o processo e seus filhos, deixando-me iniciar o postgres novamente.
Paul Masri-Stone
46

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

rm /usr/local/var/postgres/postmaster.pid

e o postgres logo iniciará bem.

Para descobrir se outro processo está em execução nessa porta, você pode fazer

ps wax | grep `head -1 /usr/local/var/postgres/postmaster.pid`

Então corra

tail -f /usr/local/var/postgres/server.log 

para ver se funcionou. Você deveria ver

FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 933) running in data directory "/usr/local/var/postgres"?
LOG:  database system was interrupted; last known up at 2014-05-25 09:41:32 PDT
LOG:  database system was not properly shut down; automatic recovery in progress

(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?)

AlexChaffee
fonte
11
Esse foi o meu caso. Eu tive outro processo sendo executado coincidentemente no mesmo PID que o postmaster.pidarquivo estava apontando. Isso ocorreu vários dias após um desligamento imundo (instalação de laptop do Postgres no OSX via homebrew).
Jesse Buchanan
11
Meu mac pendurou na tela de login e tive que desligá-lo. Isso acabou deixando um arquivo postmaster.pid em torno de um PID que foi usado para outra coisa na próxima reinicialização e o postgres não seria exibido. Tentei matar o PID (como o post recomendado pelo craig-ringer), mas isso não ajudou. No entanto, rm postmaster.pidfuncionou para mim. Não vejo corrupção de dados (mas, de qualquer forma, essa é apenas uma máquina de desenvolvimento).
Steven Chanin
A mesma coisa para mim. Eu desliguei meu mac sem parar o servidor local do Rails.
Bruno Paulino
11
Eu continuo voltando para esta discussão, sempre que isso acontece - porque eu nunca me lembro onde o arquivo pid é, então eu sempre tenho que procurá-lo: P
haslo
Isso aconteceu comigo com o Postgres.app. Depois de excluir, ~/Library/Application Support/Postgres/data/postmaster.pideu estava novamente em funcionamento.
Rob Johansen
8

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!).

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

Em seguida, basta iniciar o postgres novamente usando a sequência normal de inicialização do homebrew:

$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

Obrigado Ruckus Notes por ajudar a resolver meu problema. Espero que ajude você também.

Billy G
fonte
4

INSTRUÇÕES DE REBOOT DIFÍCIL

Eu tive esse mesmo problema após uma reinicialização completa. Depois de verificar o postmaster.pidpid do arquivo, notei que não havia nenhum processo em execução. Eu não queria excluir o arquivo .pid, mas usei um pg-stopalias que eu havia criado no meu .bash_profile. esse apelido é executado

pg_ctl -D /usr/local/var/postgres stop -s -m fast

Para referência

# psql
alias pg-start='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start'
alias pg-stop='pg_ctl -D /usr/local/var/postgres stop -s -m fast'

saída de log após pg-stop

LOG:  database system was interrupted; last known up at 2016-04-25 10:51:08 PDT
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/274FA10
LOG:  redo is not required
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
LOG:  database system was shut down at 2016-04-25 13:11:04 PDT

preparar

Também pensei em mencionar aqui que, se você instalou o postgres com homebrew, deve dar brew servicesuma olhada. Agora é assim que eu prefiro iniciar / parar meus bancos de dados.

XXXXX:~ chris$ brew services list
Name       Status  User  Plist
mongodb    stopped
postgresql started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
redis      started chris /Users/chris/Library/LaunchAgents/homebrew.mxcl.redis.plist
Chris Miller
fonte
A informação de fermentação era exatamente o que eu precisava, obrigado!
precisa saber é o seguinte
1

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.pidarquivo, o erro foi interrompido e o PG pôde iniciar novamente.

Jeff
fonte
1

Às vezes, os humildes pg_ctl -w restartpodem fazer o truque :-)

sekmo
fonte
Amor quando a resposta principal é que você está condenado! TOQUE NADA! e então um pequeno comando me faz correr. (No meu caso, o pid in /usr/pgsql/9.3/data/postmaster.pidnão estava presente no ps aux.) #
Noumenon
0

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.

giraffedata
fonte