web-dev-qa-db-fra.com

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

J'utilise postgres from homebrew dans mon OS X, mais lorsque je redémarre mon système, il arrive que postgres ne démarre pas après le redémarrage. J'ai donc essayé manuellement de le démarrer avec postgres -D /usr/local/var/postgres, mais l'erreur est survenue lors du message suivant: FATAL: could not open directory "pg_tblspc": No such file or directory.

La dernière fois que cela s'est produit, je ne pouvais pas obtenir l'état initial, alors j'ai décidé de désinstaller l'ensemble du système postgres, puis de le réinstaller et de créer des utilisateurs, des tableaux, des ensembles de données, etc. ... C'était tellement dégoûtant, mais cela se produit fréquemment sur mon système, par exemple une fois tous les quelques mois.

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

Je n'ai pas mis à niveau mon homebrew et mon postgres vers la dernière version (c'est-à-dire que j'utilise la même version). En outre, tout ce que j'ai fait sur la base de données postgres est de supprimer la table et de renseigner les nouvelles données tous les jours. Je n'ai pas changé d'utilisateur, mot de passe, etc ...

EDIT (mbannert): J'ai ressenti le besoin d'ajouter ceci, car le fil de discussion est le hit de Google pour ce problème et pour beaucoup, le symptôme est différent. Homebrewers rencontrera probablement 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 vivre cela après la mise à niveau de Yosemite, vous êtes maintenant couvert pour la lecture de ce fil.

458
Blaszard

Résolu ... en partie.

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

Pour résoudre ce problème, il vous suffit de recréer 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, plus concement ( grâce à Nate):

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

La réexécution de pg_ctl start -D /usr/local/var/postgres démarre maintenant le serveur normalement et, du moins pour moi, sans aucune perte de données.

UPDATE

Sur mon système, certains de ces répertoires sont vides même lorsque Postgres est en cours d'exécution. Peut-être, dans le cadre d’une opération de "nettoyage", Yosemite supprime-t-il tous les répertoires vides? Dans tous les cas, j'ai créé un fichier '.keep' dans chaque répertoire afin d'éviter toute suppression ultérieure.

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

Note : Création du fichier .keep dans ces répertoires créera du bruit dans votre fichier de log, mais ne semble pas affecter négativement quoi que ce soit d'autre.

924
Donovan

--- La réponse de Donavan est juste, je voulais juste ajouter que, comme j'ai fait différentes choses avec la base de données (par exemple, rake db:test), il est allé chercher différents répertoires qui n'ont pas été mentionnés ci-dessus et étoufferaient quand ils n'étaient pas présents, dans mon cas pg_logical/mappings, alors vous voudrez peut-être configurer un terminal en cours d'exécution:

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

et observez les dossiers manquants pendant que vous parcourez vos activités de base de données habituelles.

9
tony_k

Ceci est légèrement hors sujet mais mérite d'être noté ici dans le cadre du processus de récupération PostgreSQL Yosemite. J'avais le même problème que ci-dessus ET un problème avec PostgreSQL "fonctionnant" apparemment en arrière-plan, donc, même après avoir ajouté des 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 aussi essayé d'aller directement après le processus avec kill PID, mais dès que j'ai fait cela, 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é le suivant:

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

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

6
MCP

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 autre répertoire de données, 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 avec laquelle vous avez commencé postgres :)

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/postgres</string>
    <string>-D</string>
    <string>/usr/local/pgsql/data</string>

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

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}
4
tee