`pg_tblspc` manquant après l’installation de la dernière version d’OS X (Yosemite ou El Capitan)

J’utilise postgres à partir de homebrew dans mon OS X, mais quand je redémarre mon système, parfois le postgres ne démarre pas après le redémarrage, donc j’ai essayé de le démarrer manuellement avec postgres -D /usr/local/var/postgres , mais puis l’erreur s’est produite avec le message suivant: FATAL: could not open directory "pg_tblspc": No such file or directory .

La dernière fois que cela s’est produit, je n’ai pas pu l’amener à l’état initial, alors j’ai décidé de désinstaller tout le système postgres, puis de le réinstaller et de créer des utilisateurs, des tables, des jeux de données, etc. il se produit souvent sur mon système, disons une fois dans quelques mois.

Alors, pourquoi perd- pg_tblspc fréquemment le fichier pg_tblspc ? Et puis-je faire quelque chose pour éviter la perte du fichier?

Je n’ai pas mis à jour mon homebrew et postgres vers la dernière version (c’est-à-dire que j’utilise la même version). De plus, tout ce que j’ai fait sur la firebase database postgres est de supprimer la table et de remplir les nouvelles données chaque jour. Je n’ai pas changé d’utilisateur, mot de passe, etc …

EDIT (mbannert): J’ai ressenti le besoin d’append ceci, car le thread est le plus populaire sur Google pour ce problème et pour beaucoup, le symptôme est différent. Homebrewers va probablement rencontrer ce message d’erreur:

 No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? 

Donc, si vous venez de faire l’expérience de cette mise à jour après la mise à niveau de Yosemite, vous êtes maintenant couvert pour lire ce sujet.

Résolu … en partie.

Apparemment, l’installation des dernières versions d’OS X (par exemple Yosemite ou El Capitan) supprime certains répertoires dans /usr/local/var/postgres .

Pour résoudre ce problème, recréez simplement les répertoires manquants:

 mkdir /usr/local/var/postgres/pg_tblspc mkdir /usr/local/var/postgres/pg_twophase mkdir /usr/local/var/postgres/pg_stat mkdir /usr/local/var/postgres/pg_stat_tmp mkdir /usr/local/var/postgres/pg_replslot mkdir /usr/local/var/postgres/pg_snapshots 

Ou, de manière plus concise ( grâce à Nate ):

 mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/ 

Exécuter pg_ctl start -D /usr/local/var/postgres démarre maintenant le serveur normalement et, au moins pour moi, sans aucune perte de données.

METTRE À JOUR

Sur mon système, certains de ces répertoires sont vides même lorsque Postgres est en cours d’exécution. Peut-être que dans le cadre d’une opération de “nettoyage”, Yosemite supprime tous les répertoires vides? En tout cas, je suis allé de l’avant et créé un fichier ‘.keep’ dans chaque répertoire pour empêcher toute suppression ultérieure.

 touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep 

Remarque : La création du fichier .keep dans ces répertoires créera du bruit dans votre fichier journal, mais ne semblera pas affecter négativement autre chose.

La réponse de Donavan est juste, je voulais juste append que comme je faisais des choses différentes avec la firebase database (par exemple rake db:test ), elle cherchait différents répertoires qui n’avaient pas été mentionnés ci-dessus t présent, dans mon cas pg_logical/mappings , vous pouvez donc configurer un terminal en cours d’exécution:

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

et surveillez les dossiers manquants pendant que vous effectuez vos activités de firebase database habituelles.

Ceci est un peu hors-sujet mais mérite d’être noté ici dans le cadre du processus de récupération de PostgreSQL Yosemite. J’avais le même problème que ci-dessus ET j’avais un problème avec “apparemment” PostgreSQL fonctionnant en arrière-plan, donc même après l’ajout de répertoires, je ne pouvais pas redémarrer. J’ai essayé d’utiliser pg_ctl stop -m fast pour tuer le serveur PostgreSQL mais pas de chance. J’ai également essayé de poursuivre le processus directement avec kill PID mais dès que je l’ai fait, un processus PostgreSQL est réapparu avec un PID différent.

La clé a fini par être un fichier .plist que Homebrew avait chargé … Le correctif pour moi a été:

 launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist 

Après cela, j’ai pu démarrer PostgreSQL normalement.

Les répertoires manquants doivent être présents dans votre répertoire de données PostgreSQL. Le répertoire de données par défaut est /usr/local/var/postgres/ . Si vous avez configuré un répertoire de données différent, vous devez y recréer les répertoires manquants. Si vous avez modifié le fichier .plist recommandé par homebrew qui lance PostgreSQL, vous pouvez y trouver le répertoire de données:

 cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist 

(c’est l’option -D vous avez commencé postgres 🙂

  ProgramArguments  /usr/local/bin/postgres -D /usr/local/pgsql/data 

Dans l’exemple ci-dessus, vous créeriez les répertoires manquants dans /usr/local/pgsql/data , comme ceci:

 cd /usr/local/pgsql/data mkdir {pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots,pg_logical} mkdir pg_logical/{snapshots,mappings} 

La création des répertoires manquants fonctionne certes mais je l’ai corrigé en réinitialisant postgres db, c’est une approche plus propre pour éviter de futurs problèmes.

REMARQUE: cette approche supprime les bases de données existantes

 $ rm -r /usr/local/var/postgres $ initdb -D /usr/local/var/postgres