Brakuje `pg_tblspc` po instalacji najnowszej wersji OS X (Yosemite lub El Capitan)

464

Używam postgres z homebrew w moim OS X, ale po ponownym uruchomieniu systemu, czasami postgres nie uruchamia się po restarcie, a więc ręcznie próbował uruchomić go postgres -D /usr/local/var/postgres, ale potem wystąpił błąd z następującym komunikatem: FATAL: could not open directory "pg_tblspc": No such file or directory.

Ostatnim razem, kiedy to wystąpiło, nie mogłem przywrócić go do pierwotnego stanu, więc postanowiłem odinstalować cały system postgres, a następnie ponownie go zainstalować i utworzyć użytkowników, tabele, zestawy danych itp. To było obrzydliwe, ale często występuje w moim systemie, powiedzmy raz na kilka miesięcy.

Dlaczego więc pg_tblspcczęsto gubi plik? Czy mogę coś zrobić, aby uniknąć utraty pliku?

Nie uaktualniłem swojego homebrew i postgres do najnowszej wersji (tj. Korzystałem z tej samej wersji). Ponadto wszystko, co zrobiłem w bazie danych Postgres, to usuwanie tabeli i wypełnianie nowych danych każdego dnia. Nie zmieniłem użytkownika, hasła itp.

EDYCJA (mbannert): Czułem potrzebę dodania tego, ponieważ ten wątek jest największym hitem w Google dla tego problemu i dla wielu symptom jest inny. Homebrewers prawdopodobnie napotkają ten komunikat o błędzie:

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

Jeśli więc doświadczyłeś tego po aktualizacji Yosemite, jesteś teraz objęty czytaniem tego wątku.

Blaszard
źródło
Eee, to naprawdę, naprawdę nie powinno! Kiedy mówisz „najnowsza wersja”, pokaż dokładny numer wersji. Czy umieściłeś też jakieś obszary tabel w pamięci zewnętrznej? gdzie znajduje się katalog danych PostgreSQL?
Craig Ringer
Ponadto, pg_tblspcjest katalog . Jedynym sposobem, w jaki widzę ten katalog i tylko ten losowo znikający katalog, jest uszkodzenie systemu plików lub szczególnie źle działający skaner antywirusowy lub narzędzie do synchronizacji plików.
Craig Ringer
Nie mam skanera antywirusowego. Nie wiem, co tablespacesjest, więc nie sądzę, żebym umieścił to w pamięci zewnętrznej.
Blaszard
Hm Wszystko, co mogę powiedzieć, że coś jest źle źle. pg_tblspcnie tylko znika w żadnym systemie, z którym się kiedykolwiek spotkałem, ani nie wyobrażam sobie zdrowego powodu. Bardzo trudno będzie powiedzieć, co wyróżnia Twój system bez większej ilości szczegółów.
Craig Ringer
2
Czy udało Ci się znaleźć rozwiązanie dla tego @Gardecolo? Mam ten sam problem po aktualizacji do Yosemite.
Donovan

Odpowiedzi:

928

Rozwiązany ... częściowo.

Najwyraźniej instalacja najnowszych wersji OS X (np. Yosemite lub El Capitan) usuwa niektóre katalogi /usr/local/var/postgres.

Aby to naprawić, wystarczy odtworzyć brakujące katalogi:

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

Lub, bardziej zwięźle ( dzięki Nate ):

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

Ponowne pg_ctl start -D /usr/local/var/postgresuruchamianie uruchamia teraz serwer normalnie i, przynajmniej dla mnie, bez utraty danych.

AKTUALIZACJA

W moim systemie niektóre z tych katalogów są puste, nawet gdy działa Postgres. Może w ramach operacji „czyszczenia” Yosemite usuwa puste katalogi? W każdym razie poszedłem naprzód i utworzyłem plik „.keep” w każdym katalogu, aby zapobiec późniejszemu usunięciu.

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

Uwaga : Utworzenie .keeppliku w tych katalogach spowoduje pewne zakłócenia w pliku dziennika, ale nie wydaje się mieć negatywnego wpływu na nic innego.

Donovan
źródło
53
Tylko sugestia dla bardziej zwięzłego polecenia: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/itouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate
26
Te pliki .keep wywołują u mnie trochę żalu w logach serwera:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost,
13
Brakowało mi również katalogów pg_snapshots i pg_stat.
Jon Stevens,
8
Musiałem także utworzyć jeden dodatkowy katalog „pg_replslot”. Tyle że działa dobrze. Dzięki!
Lucas,
6
doświadczył tego samego jak @Lucas dla butelkowanych postgresów 9.4.0. Musiałem mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell,
9

Odpowiedź Donavana jest natychmiastowa, chciałem tylko dodać, że ponieważ robiłem różne rzeczy z bazą danych (np. rake db:test), Szukałem różnych katalogów, które nie zostały wspomniane powyżej i dusiły się, gdy nie były obecne, w mój przypadek pg_logical/mappings, więc możesz chcieć skonfigurować terminal działający:

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

i obserwuj, czy brakuje folderów podczas wykonywania typowych czynności w bazie danych.

tony_k
źródło
3
Potrzebne do dodania mkdir -p / usr / local / var / postgres / pg_logical / {migawki, mapowania}
peter_v
6

Jest to nieco nie na temat, ale warto o tym wspomnieć w ramach procesu odzyskiwania PostgreSQL Yosemite. Miałem taki sam problem jak powyżej ORAZ miałem problem z PostgreSQL „pozornie” działającym w tle, więc nawet po dodaniu katalogów nie mogłem ponownie uruchomić. Próbowałem pg_ctl stop -m fastzabić serwer PostgreSQL, ale bez powodzenia. Próbowałem też przejść bezpośrednio do tego procesu, kill PIDale gdy tylko to zrobiłem, proces PostgreSQL pojawił się ponownie z innym PID.

Klucz okazał się .plistplikiem załadowanym przez Homebrew ... Dla mnie poprawka:

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

Potem mogłem normalnie uruchomić PostgreSQL.

MCP
źródło
Mój pług został nazwany nieco inaczej: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistale w zasadzie był to dla mnie ten sam problem i to samo rozwiązanie.
onekiloparsec
4

Brakujące katalogi muszą znajdować się w katalogu danych PostgreSQL. Domyślny katalog danych to /usr/local/var/postgres/. Jeśli skonfigurowałeś inny katalog danych, musisz ponownie utworzyć brakujące katalogi. Jeśli zmodyfikowałeś .plistplik zalecany przez Homebrew , który uruchamia PostgreSQL, możesz tam znaleźć katalog danych:

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

(jest to -Dopcja, od której zacząłeś postgres :)

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

W powyższym przykładzie utworzyłbyś brakujące katalogi w następujący /usr/local/pgsql/datasposób:

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}
trójnik
źródło
-20

Utworzenie brakujących katalogów z pewnością działa, ale naprawiłem to poprzez ponowne zainicjowanie bazy danych postgres, jest to czystsze podejście, aby uniknąć przyszłych problemów.

UWAGA: Podejście to usunie istniejące bazy danych

$ rm -r /usr/local/var/postgres
$ initdb -D /usr/local/var/postgres
Greg
źródło
19
Oczywiście usunięcie istniejących baz danych nie jest tutaj drobnym wyjątkiem. To trochę jak powiedzenie „Nie mogłem znaleźć / var / tmp, więc ponownie zainstalowałem system operacyjny”.
Adam Donahue,
4
Och, człowieku, to jest „czystsze” niż cokolwiek, co mogę wymyślić :) Mam tylko nadzieję, że jakiś przypadkowy paster kopiujący z interwebz nie nakręci tego bezpośrednio na swoją konsolę, nie patrząc na to :)
Halil Özgür
2
Przepraszam za głosowanie w dół Greg, ale zalecam przeredagowanie rozwiązania, aby wyraźnie zaznaczyć, że takie podejście powinno być stosowane tylko w fazie programowania lub jeśli użytkownik może sobie pozwolić na wyczyszczenie swojej bazy danych.
hraynaud
1
Dlaczego jest to tak mało cenione? Na serwerze deweloperskim jest to właściwy sposób.
Jordon Bedwell,
@JordonBedwell nawet na serwerze deweloperskim jest złym pomysłem, chyba że grasz z pojedynczą aplikacją korzystającą z db na komputerze. To jest jak „Nie mogę uruchomić mojego ulubionego edytora kodu, zainstalujmy ponownie system operacyjny”
Andre Figueiredo