Je viens de réinstaller Postgres via brew install postgres
J'ai couru initdb /usr/local/var/postgres -E utf8
mais j'ai eu 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".
alors, j'ai rm -rf
le dossier postgres et l' ai relancé:
initdb /usr/local/var/postgres -E utf8
il a dit que tout allait bien:
Success. You can now start the database server using:
postgres -D /usr/local/var/postgres
alors, j'ai exécuté cette commande et 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 ça?
postgres
avec un postmaster et cinq utilitaires. PostgreSQL est une architecture multi-processus.Réponses:
Annonce de service public: ne jamais supprimer
postmaster.pid
. Vraiment. Excellent moyen d'obtenir la corruption de données.PostgreSQL était déjà installé et vous avez supprimé le répertoire de données sans arrêter le serveur en cours d'exécution. Vous avez donc maintenant des processus serveur PostgreSQL orphelins qui gèrent les fichiers de données qui ont été supprimés. Ils ne sont donc plus accessibles dans le système de fichiers et seront complètement supprimés lorsque le dernier descripteur de fichier ouvert leur sera fermé. Vous ne pouvez pas
pg_ctl
arrêter le serveur normalement, car vous avez supprimé le datadir du cluster. Vous devez donc simplement tuer les processus. Tuez le maître de poste (ne l' utilisez paskill -9
, un meurtre ordinaire suffira) et le reste s'arrêtera aussi.Vous pourrez alors démarrer un nouveau serveur dans le datadir avec les
initdb
données fraîches .Il est fort probable que vous rencontriez des conflits sur la piste à moins de désinstaller l'ancienne version de PostgreSQL.
En un mot:
cat /usr/local/var/postgres/postmaster.pid
Notez le numéro sur la première ligne, qui est le pid du postmaster.
Vérifiez avec
ps
cela que le pid est celui d'un postmaster postmaster.Tuez le processus postmaster avec la commande suivante, en remplaçant «PID» par le numéro que vous avez noté. Encore une fois, ne pas utiliser
kill -9
oukill -KILL
simplement utiliser un simplekill
, c'est-à-dire unSIGTERM
:kill PID
Si le pid n'est pas celui d'un postmaster postmaster, définissez manuellement
kill
tous lespostgres
backends pouvant encore être en cours d'exécution, vérifiez qu'ils ne le sont plus, puis supprimez-lespostmaster.pid
. (Vous devez également vérifier que lepostmaster.pid
ne se trouve pas sur un stockage partagé sur lequel le serveur pourrait être exécuté sur une autre machine virtuelle / hôte).la source
kill PID
n'a pas fonctionné pour moi. J'avais besoinkill -3 PID
. Dans mon cas, j’ai fait un arrêt qui peut avoir tué des fenêtres de terminal sans arrêter les processus correctement. Lekill -3 PID
processus a été tué et ses enfants m'ont permis de relancer postgres.Une autre possibilité est que vous ayez eu un arrêt brutal et que le processus postgres soit mort sans nettoyer son fichier pid. Cela m’arrive quand la batterie de mon ordinateur portable meurt.
Cette solution n'est pas destinée à un système de production et vous devez vraiment vous assurer que le démon postgres ne fonctionne pas , mais j'utilise mon ordinateur portable pour le codage et je ne crains pas de devoir régénérer mes bases de données.
Donc, si un autre processus - ou aucun du tout - est en cours d'exécution sur ce port, supprimez simplement le fichier pid, par exemple
et postgres va bientôt commencer bien.
Pour savoir si un autre processus est en cours d'exécution sur ce port, vous pouvez effectuer
Puis courir
pour voir si cela a fonctionné. Tu devrais voir
(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 le PID 933 et supprimer le fichier pid bidon tout seul?)
la source
postmaster.pid
fichier désignait. C'était plusieurs jours après un arrêt impropre (installation de Postgres sous OSX sur un ordinateur portable via homebrew).rm postmaster.pid
travaillé pour moi. Je ne vois aucune corruption de données (mais dans tous les cas, il ne s'agit que d'une machine de développement).~/Library/Application Support/Postgres/data/postmaster.pid
j'étais à nouveau opérationnel.J'ai essayé tout cela en vain après la mise à niveau vers Yosemite qui a cassé mon postgres (installé via homebrew).
Puis je suis tombé sur cet article: http://ruckus.tumblr.com/post/100355276496/yosemite-upgrade-breaks-homebrew-installed-postgres
Tout d'abord, je devais créer les répertoires manquants qui avaient apparemment été supprimés lors de la mise à niveau (merci à Apple!).
Ensuite, relancez simplement postgres en utilisant la séquence de lancement homebrew normale:
Merci Ruckus Notes pour avoir aidé à résoudre mon problème. J'espère que cela vous aidera aussi.
la source
INSTRUCTIONS DE REDEMARRAGE DUR
J'ai eu ce même problème après un redémarrage difficile. Après avoir vérifié le
postmaster.pid
pid du fichier, j'ai remarqué qu'aucun processus n'était en cours d'exécution. Je ne voulais pas supprimer le fichier .pid, mais j’ai utilisé unpg-stop
alias que j’avais créé dans mon fichier .pid.bash_profile
. cet alias ne fait que courirpg_ctl -D /usr/local/var/postgres stop -s -m fast
Pour référence
enregistrer la sortie après
pg-stop
brasser
Je pensais que je devrais également mentionner ici que si vous avez installé Postgres avec homebrew, vous devriez
brew services
jeter un coup d'œil. C’est maintenant comment je préfère démarrer / arrêter mes bases de données.la source
J'ai reçu cette erreur après, je pense, mon ordinateur est tombé en panne. PostgreSQL n'a même pas pu démarrer à cause de cette erreur, si bien que tuer le processus n'était pas la solution. J'ai simplement sauvegardé puis supprimé le
postmaster.pid
fichier, puis l'erreur s'est arrêtée et PG a pu redémarrer.la source
Parfois, les humbles
pg_ctl -w restart
peuvent faire l'affaire :-)la source
/usr/pgsql/9.3/data/postmaster.pid
n'était pas présent dans le ps aux.)La suppression de postmaster.pid est en réalité une chose vraiment décente à faire à chaque démarrage, à l’aveugle. C'est ce que mon système fait. Parce que vous venez de démarrer, vous savez qu’aucun processus Postgres n’est en cours d’exécution, et si vous récupérez après un arrêt impropre, ce fichier empêchera votre récupération.
Une meilleure conception pour Postgres consisterait à placer le fichier postmaster.pid dans le système de fichiers / run, afin de garantir sa suppression à chaque redémarrage. Beaucoup d'autres serveurs fonctionnent de cette façon.
la source