OS X'in en son sürümünün (Yosemite veya El Capitan) kurulumundan sonra `pg_tblspc` eksik


465

Benim OS X homebrew gelen postgres kullanmak, ama benim sistemi yeniden ne zaman, bazen postgres el ile başlatmaya çalışması yeniden başlatıldıktan sonra, vb başlamaz postgres -D /usr/local/var/postgres, ama sonra hata aşağıdaki iletiyle oluştu: FATAL: could not open directory "pg_tblspc": No such file or directory.

En son gerçekleştiğinde, orijinal duruma getiremedim, bu yüzden tüm postgres sistemini kaldırmaya karar verdim ve sonra yeniden yükledim ve kullanıcılar, tablolar, veri setleri vb. Yarattım ... Çok iğrençti, ama birkaç ay içinde bir kez, sistemimde sık sık meydana gelir.

Peki neden pg_tblspcdosyayı sık sık kaybediyor ? Ve dosyanın kaybını önlemek için yapabileceğim bir şey var mı?

Homebrew ve postgres'imi en son sürüme yükseltmedim (yani aynı sürümü kullanıyorum). Ayrıca, postgres veritabanında yaptığım her şey tabloyu silmek ve her gün yeni verileri doldurmaktır. Kullanıcı, şifre vb. Değiştirmedim.

EDIT (mbannert): Konu eklemek için hissettim, çünkü konu bu sorun için google'da en iyi hit ve birçok kişi için belirti farklı. Homebrewers muhtemelen bu hata mesajıyla karşılaşacak:

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

Eğer Yosemite güncellemesinden sonra bunu daha yeni tecrübe ettiyseniz, şimdi bu konuyu okumaya hazırsınız demektir.


Eep, gerçekten, gerçekten olmamalı! "En son sürüm" dediğinizde, lütfen tam sürüm numarasını gösterin. Ayrıca, harici depolama alanına herhangi bir tablo alanı koydunuz mu? PostgreSQL veri dizini nerede?
Craig Ringer

Ayrıca, pg_tblspcbir dizin . Bu dizini ve sadece bu dizini rastgele kaybolan görebilmemin tek yolu dosya sistemi bozulması veya özellikle kötü davranılmış bir virüs tarayıcı veya dosya eşitleme aracıdır.
Craig Ringer

Virüs tarayıcım yok. Ne olduğunu bilmiyorum tablespaces, bu yüzden harici depolama alanına koyduğumu sanmıyorum.
Blaszard

Hm. Tek söyleyebileceğim tek şey bir şey olduğunu kötü yanlış. pg_tblspcsadece şimdiye kadar karşılaştığım herhangi bir sistemde kaybolmaz, bunun akıl almaz bir sebebi de hayal edemez. Sisteminizi çok daha fazla ayrıntıya ayırmadan farklı kılan şeyin ne olduğunu söylemek çok zor olacak.
Craig Ringer

2
Bu @Gardecolo için bir çözüm bulabildiniz mi? Aynı sorunu Yosemite'a yükselttikten sonra da yaşıyorum.
Donovan

Yanıtlar:


928

Çözüldü ... kısmen.

Görünüşe göre, OS X'in en son sürümlerini (ör. Yosemite veya El Capitan) yüklemek, içindeki bazı dizinleri kaldırır /usr/local/var/postgres.

Bunu düzeltmek için eksik dizinleri yeniden oluşturmanız yeterlidir:

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

Veya daha kısaca ( Nate sayesinde ):

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

Yeniden çalıştırma pg_ctl start -D /usr/local/var/postgresşimdi sunucuyu normal bir şekilde ve en azından benim için veri kaybı olmadan başlatır.

GÜNCELLEME

Sistemimde, Postgres çalışırken bile bu dizinlerden bazıları boş. Belki, bazı "temizleme" işleminin bir parçası olarak, Yosemite boş dizinleri kaldırır? Her durumda, ileride silinmesini önlemek için her dizinde bir '.keep' dosyası oluşturdum.

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

Not : .keepDosyayı bu dizinlerde oluşturmak, günlük dosyanızda biraz gürültü yaratır, ancak başka hiçbir şeyi olumsuz etkilemez.


53
Daha kısa bir komut için sadece bir öneri: mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/vetouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate

26
Bu .keep dosyaları aslında bana sunucu günlüklerinde biraz keder neden:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
Ayrıca pg_snapshots ve pg_stat dizinleri eksikti.
Jon Stevens

8
Ayrıca ekstra bir 'pg_replslot' dizini oluşturmak zorunda kaldım. İyi çalışıyor dışında. Teşekkürler!
Lucas

6
şişelenmiş postgres için @Lucas ile aynı tecrübeli 9.4.0. Ben mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell

9

Donavan'ın cevabı nokta, sadece veritabanı ile farklı şeyler yaptığım gibi eklemek istedim (örneğin rake db:test), yukarıda belirtilmeyen ve mevcut olmadığında boğulan farklı dizinleri aramaya gitti. benim durumum pg_logical/mappings, bu yüzden çalışan bir terminal kurmak isteyebilirsiniz:

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

ve tipik veritabanı etkinliklerinize giderken eksik klasörleri izlemenizi sağlar.


3
Mkdir -p / usr / local / var / postgres / pg_logical / {snapshots,
mappings

6

Bu biraz konu dışıdır, ancak burada PostgreSQL Yosemite kurtarma sürecinin bir parçası olarak dikkat çekmeye değer. Ben yukarıdaki ile aynı sorunu vardı ve ben bile yeniden başlatılamadı dizinleri ekledikten sonra PostgreSQL "görünüşte" arka planda çalışan bir sorun vardı. pg_ctl stop -m fastPostgreSQL sunucusunu öldürmeye çalıştım ama şansım yoktu. Ayrıca doğrudan ile işlemden sonra devam etmeyi denedim kill PIDama bir PostgreSQL süreci farklı bir PID ile yeniden ortaya çıktı.

Anahtar .plistHomebrew'un yüklediği bir dosya oldu ... Benim için düzeltme şu şekilde oldu:

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

Bundan sonra normalde PostgreSQL'i başlatabiliyordum.


Plistim biraz farklı adlandırıldı: launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistama temelde bu benim için aynı sorun ve aynı çözümdü.
onekiloparsec

4

Eksik dizinlerin PostgreSQL veri dizininizde bulunması gerekir. Varsayılan veri dizinidir /usr/local/var/postgres/. Farklı bir veri dizini ayarladıysanız, orada eksik dizinleri yeniden oluşturmanız gerekir. .plistPostgreSQL'i başlatan homebrew tarafından önerilen dosyayı değiştirdiyseniz , veri dizinini burada bulabilirsiniz:

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

( -Dpostgres ile başladığınız seçenek :)

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

Yukarıdaki örnekte /usr/local/pgsql/data, aşağıdaki gibi eksik dizinleri oluşturacaksınız :

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}

0

Dockerized Rails uygulaması ile bu sorunu yaşıyordum.

Pg_tblspc ve / usr / local / var / postgres dizininde bulunmayan diğer dizinler yerine myRailsApp / tmp / db dosyasında eksikti.

Donovan'ın çözümünün benzer bir sürümünü kullanmak isteyeceksiniz, Rails uygulamanız için doğru yola sahip olmak zorundasınız ...

mkdir /myRailsApp/tmp/db/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/

Ayrıca, git'in boş dizinleri dikkate almadığından emin olmak için bir .keep dosyası eklemek isteyeceksiniz.

touch /myRailsApp/tmp/db/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep

Dizinlerden birinde .keep ile ilgili bir hata fark ettim, bu yüzden komut satırı çıktısını dikkatlice okuyun ve gerektiği gibi ayarlayın.


-20

Eksik dizinleri oluşturmak kesinlikle işe yarıyor ama postgres db'yi yeniden başlatarak düzelttim, bu gelecekteki sorunları önlemek için daha temiz bir yaklaşımdır.

NOT: Bu yaklaşım mevcut veritabanlarını siler

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

19
Mevcut veritabanlarının silinmesi burada küçük bir istisna değildir. Bu, "/ var / tmp dosyasını bulamadım, bu yüzden işletim sistemini yeniden yükledim" demek gibi.
Adam Donahue

4
Ah, adamım, bu aklıma gelen her şeyden "daha temiz" :) İnterwebz'den bazı rastgele kopyalayıcıların bakmadan bunu doğrudan konsollarına atmalarını umuyoruz :)
Halil Özgür

2
Özür dilerim Greg için üzgünüm, ancak bu yaklaşımın yalnızca geliştirme aşamasında veya kullanıcı DB'sini silme gücüne sahip olması gerektiğinde açıkça belirtmek için çözümünüzü yeniden düzenlemenizi öneririz.
hraynaud

1
Bu neden bu kadar çok düşürüldü? Bir dev sunucusunda bu doğru yoldur.
Jordon Bedwell

@JordonBedwell bile bilgisayarınızda db kullanarak tek bir uygulama ile oynamıyorsanız sürece bir dev sunucusunda bile kötü bir fikir .. "En sevdiğim kod düzenleyiciyi başlatamıyorum, işletim sistemini yeniden
yükleyeceğim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.