Manca `pg_tblspc` dopo l'installazione dell'ultima versione di OS X (Yosemite o El Capitan)


464

Io uso Postgres da homebrew nel mio OS X, ma quando riparto il mio sistema, a volte le Postgres non viene avviato dopo il riavvio, e così ho provato manualmente per cominciare con postgres -D /usr/local/var/postgres, ma poi l'errore si è verificato con il seguente messaggio: FATAL: could not open directory "pg_tblspc": No such file or directory.

L'ultima volta che si è verificato, non sono riuscito a riportarlo allo stato originale, quindi ho deciso di disinstallare l'intero sistema Postgres e quindi reinstallarlo e creato utenti, tabelle, set di dati, ecc ... Era così disgustoso, ma si verifica spesso sul mio sistema, diciamo una volta ogni pochi mesi.

Quindi perché perde pg_tblspcspesso il file? E c'è qualcosa che posso fare per evitare la perdita del file?

Non ho aggiornato il mio homebrew e postgres all'ultima versione (ovvero sto usando la stessa versione). Inoltre, tutto ciò che ho fatto sul database Postgres è eliminare la tabella e popolare i nuovi dati ogni giorno. Non ho modificato l'utente, la password, ecc ...

EDIT (mbannert): ho sentito la necessità di aggiungere questo, dal momento che il thread è il massimo successo su Google per questo problema e per molti il ​​sintomo è diverso. Gli homebrewer probabilmente incontreranno questo messaggio di errore:

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

Quindi, se lo hai appena sperimentato dopo l'aggiornamento di Yosemite, ora sei coperto per ora leggendo questo thread.


Eep, davvero, davvero non dovrebbe! Quando dici "ultima versione", mostra il numero esatto della versione. Inoltre, hai messo dei tablespace sulla memoria esterna? dove si trova la directory dei dati PostgreSQL?
Craig Ringer,

Inoltre, pg_tblspcè una directory . L'unico modo in cui riesco a vedere questa directory e solo questa directory che scompare casualmente è la corruzione del filesystem o uno scanner di virus o uno strumento di sincronizzazione dei file particolarmente mal comportato.
Craig Ringer,

Non ho alcun programma antivirus. Non so cosa tablespacessia, quindi non credo di averlo messo su memoria esterna.
Blaszard,

Hm. Tutto quello che posso dirti è che qualcosa è gravemente sbagliato. pg_tblspcnon scompare solo su qualsiasi sistema che abbia mai incontrato, né posso immaginare una ragione sana che lo farebbe. Sarà molto difficile dire cosa rende il tuo sistema diverso senza molti più dettagli.
Craig Ringer,

2
Sei riuscito a trovare una soluzione per questo @Gardecolo? Sto riscontrando lo stesso problema dopo l'aggiornamento a Yosemite.
Donovan,

Risposte:


928

Risolto ... in parte.

Apparentemente, l'installazione delle ultime versioni di OS X (ad es. Yosemite o El Capitan) rimuove alcune directory in /usr/local/var/postgres.

Per risolvere questo problema, devi semplicemente ricreare le directory mancanti:

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

O, più concisamente ( grazie a Nate ):

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

La riesecuzione pg_ctl start -D /usr/local/var/postgresora avvia il server normalmente e, almeno per me, senza perdita di dati.

AGGIORNARE

Sul mio sistema, alcune di quelle directory sono vuote anche quando Postgres è in esecuzione. Forse, nell'ambito di un'operazione di "pulizia", ​​Yosemite rimuove eventuali directory vuote? In ogni caso, sono andato avanti e ho creato un file '.keep' in ogni directory per impedire la cancellazione futura.

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

Nota : la creazione del .keepfile in quelle directory creerà del rumore nel file di log, ma non sembra influire negativamente su qualsiasi altra cosa.


53
Solo un suggerimento per un comando più conciso: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/etouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate

26
Quei file .keep in realtà mi causano un po 'di dolore nei registri del server:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
Mi mancavano anche le directory pg_snapshots e pg_stat.
Jon Stevens,

8
Ho anche dovuto creare una directory extra 'pg_replslot'. Solo che funziona benissimo. Grazie!
Lucas,

6
sperimentato come @Lucas per postgres in bottiglia 9.4.0. Ho dovuto mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell il

9

La risposta di Donavan è precisa, volevo solo aggiungere che mentre facevo cose diverse con il database (ad esempio rake db:test), è andato alla ricerca di directory diverse che non sono state menzionate sopra e che soffocerebbero quando non erano presenti, in il mio caso pg_logical/mappings, quindi potresti voler impostare un terminale in esecuzione:

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

e guardalo per cartelle mancanti mentre passi attraverso le tue attività tipiche del database.


3
Necessario aggiungere mkdir -p / usr / local / var / postgres / pg_logical / {istantanee, mappature}
peter_v

6

Questo è leggermente fuori tema, ma vale la pena notare qui come parte del processo di recupero di Yosemite PostgreSQL. Ho avuto lo stesso problema di cui sopra E ho avuto un problema con PostgreSQL "apparentemente" in esecuzione in background, quindi anche dopo aver aggiunto le directory non sono riuscito a riavviare. Ho provato a usare pg_ctl stop -m fastper uccidere il server PostgreSQL ma senza fortuna. Ho anche provato a seguire direttamente il processo kill PIDma non appena ho fatto che un processo PostgreSQL riapparisse con un PID diverso.

La chiave ha finito per essere un .plistfile che Homebrew aveva caricato ... La correzione per me è stata:

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

Successivamente sono stato in grado di avviare PostgreSQL normalmente.


Il mio plist era chiamato in modo leggermente diverso: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistma sostanzialmente quello era anche lo stesso problema per me e la stessa soluzione.
onekiloparsec,

4

Le directory mancanti devono essere presenti nella directory dei dati PostgreSQL. La directory di dati predefinita è /usr/local/var/postgres/. Se è stata impostata una directory di dati diversa, è necessario ricreare lì le directory mancanti. Se hai modificato il .plistfile raccomandato da homebrew che avvia PostgreSQL, puoi trovare lì la directory dei dati:

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

(è l' -Dopzione con cui hai iniziato Postgres :)

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

Nell'esempio sopra, dovresti creare le directory mancanti in questo /usr/local/pgsql/datamodo:

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}

-20

La creazione delle directory mancanti funziona sicuramente, ma l'ho risolto reinizializzando Postgres DB, questo è un approccio più pulito per evitare problemi futuri.

NOTA: questo approccio eliminerà i database esistenti

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

19
Ovviamente la cancellazione di database esistenti non è un'eccezione minore qui. Questo è un po 'come dire "Non sono riuscito a trovare / var / tmp, quindi ho reinstallato il sistema operativo".
Adam Donahue,

4
Oh, amico, questo è "più pulito" di qualsiasi cosa mi venga in mente :) Spero solo che un copiatore casuale di interwebz non lo spari direttamente nella loro console senza guardarlo :)
Halil Özgür

2
Ci scusiamo per il voto negativo di Greg, ma ti consiglio di riformulare la tua soluzione per rendere esplicito che questo approccio dovrebbe essere utilizzato solo in fase di sviluppo o se l'utente può permettersi di cancellare il proprio DB.
Hraynaud,

1
Perché questo downvoting è così tanto? Su un server di sviluppo questo è il modo giusto.
Jordon Bedwell,

@JordonBedwell anche su un server di sviluppo è una cattiva idea, a meno che tu non stia giocando con una singola app usando db sul tuo computer .. È come "Non riesco ad avviare il mio editor di codice preferito, reinstalliamo il sistema operativo"
Andre Figueiredo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.