90 votes

"FATAL : le fichier de verrouillage "postmaster.pid" existe déjà"

Je viens de réinstaller postgres via brew install postgres

J'ai couru initdb /usr/local/var/postgres -E utf8 mais j'ai obtenu ceci :

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

donc, je rm -rf le dossier postgres et l'a relancé :

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

ça disait que tout allait bien :

Success. You can now start the database server using:

    postgres -D /usr/local/var/postgres

donc, j'ai lancé cette commande et j'ai obtenu :

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

Maintenant, lorsque je regarde mon moniteur d'activité, je peux voir 6 instances de postgress.

Comment puis-je réparer cela ?

63voto

AlexChaffee Points 731

Une autre possibilité est que vous ayez eu un arrêt brutal et que le processus postgres soit mort sans avoir nettoyé son fichier pid. Cela m'arrive lorsque la batterie de mon ordinateur portable est à plat.

Cette solution est no pour un système de production, et vous devriez vraiment vous assurer que le démon postgres ne tourne pas Mais j'utilise mon ordinateur portable pour coder et je ne m'inquiète pas de devoir régénérer mes bases de données.

Ainsi, si un autre processus - ou aucun processus du tout - tourne sur ce port, il suffit de supprimer le fichier pid, par ex.

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

et postgres va bientôt démarrer correctement.

Pour savoir si un autre processus est en cours d'exécution sur ce port, vous pouvez effectuer les opérations suivantes

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

Ensuite, exécutez

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

pour voir si ça a marché. Vous devriez voir

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 du moins c'est ce que je viens de voir après avoir fait ce qui précède :-) )

(Et vraiment, Postgres ne devrait-il pas être assez intelligent pour se rendre compte qu'il n'y a pas de processus avec PID 933 et supprimer le faux fichier pid de lui-même) ?

8voto

Billy G Points 81

J'ai essayé tout cela en vain après que la mise à niveau vers Yosemite ait cassé mon postgres (installé via homebrew).

Puis je suis tombée sur cet article de blog : http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres

J'ai d'abord dû créer les répertoires manquants qui ont apparemment été effacés lors de la mise à jour (merci Apple !).

$ cd /usr/local/var/postgres

$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}

Ensuite, il suffit de redémarrer postgres en utilisant la séquence de lancement normale de homebrew :

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

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

Merci Ruckus Notes pour avoir aidé à résoudre mon problème. J'espère que cela vous aidera aussi.

6voto

Chris Miller Points 61

INSTRUCTIONS DE REDÉMARRAGE À FROID

J'ai eu le même problème après un redémarrage brutal. Après avoir vérifié le postmaster.pid j'ai remarqué que je n'avais aucun processus en cours. Je n'ai pas voulu effacer le fichier .pid, mais j'ai plutôt utilisé un fichier pg-stop que j'avais créé dans mon .bash_profile . cet alias exécute simplement

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

Pour référence

# 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'

sortie du journal aprè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

brasser

J'ai pensé que je devrais également mentionner ici que si vous avez installé postgres avec homebrew, vous devriez donner à brew services un regard. C'est maintenant la façon dont je préfère démarrer/arrêter mes bases de données.

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

2voto

giraffedata Points 21

Supprimer postmaster.pid est en fait une chose très décente à faire à chaque démarrage, aveuglément. C'est ce que fait mon système. Parce que vous venez de démarrer, vous savez qu'il n'y a pas de processus Postgres en cours d'exécution, et si vous vous remettez d'un arrêt malpropre, ce fichier sera là pour empêcher votre récupération.

Une meilleure conception pour Postgres serait de placer le fichier postmaster.pid dans le système de fichiers /run, afin de garantir sa suppression à chaque redémarrage. De nombreux autres serveurs fonctionnent de cette manière.

1voto

J'ai reçu cette erreur après, je pense, un crash de mon ordinateur. PostgreSQL ne pouvait même pas démarrer à cause de cette erreur, donc tuer le processus n'était pas la solution. J'ai simplement sauvegardé et ensuite supprimé le fichier postmaster.pid puis l'erreur s'est arrêtée et PG a pu recommencer.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X