OS Xの最新バージョン(YosemiteまたはEl Capitan)のインストール後に `pg_tblspc`が見つからない


464

OSXでhomebrewのpostgresを使用していますが、システムを再起動すると、再起動後にpostgresが起動しない場合があるため、で手動で起動しようとしpostgres -D /usr/local/var/postgresましたが、次のメッセージでエラーが発生しました:FATAL: could not open directory "pg_tblspc": No such file or directory

前回発生したときに元の状態に戻すことができなかったため、postgresシステム全体をアンインストールしてから再インストールし、ユーザー、テーブル、データセットなどを作成することにしました。それは私のシステムで頻繁に発生します。たとえば、数か月に一度です。

それではなぜpg_tblspcファイルが頻繁に失われるのですか?そして、ファイルの損失を避けるために私ができることはありますか?

自作とpostgresを最新バージョンにアップグレードしていません(つまり、同じバージョンを使用しています)。また、postgresデータベースで私が行ったすべてのことは、テーブルを削除して毎日新しいデータを入力することです。ユーザー、パスワードなどを変更していません...

編集(mbannert):この問題ではスレッドがグーグルのトップヒットであり、多くの症状が異なるため、これを追加する必要があると感じました。Homebrewersはこのエラーメッセージに遭遇する可能性があります。

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

したがって、ヨセミテのアップグレード後にこれを経験したばかりの場合は、今このスレッドを読んでいます。


ええ、それは本当に、本当にすべきではありません!「最新バージョン」と言うときは、正確なバージョン番号を示してください。また、外部ストレージにテーブルスペースを配置しましたか?PostgreSQLデータディレクトリはどこにありますか?
クレイグリンガー

また、pg_tblspcあるディレクトリが。このディレクトリを見ることができる唯一の方法は、このディレクトリだけがランダムに消えてしまうことです。
クレイグリンガー

ウイルススキャナーはありません。何なのかわからないtablespacesので、外部ストレージには入れないと思います。
Blaszard 2014

うーん。私に言えることは、何かがひどく間違っているということだけです。pg_tblspc私がこれまでに遭遇したどのシステムでも消えるだけではなく、それが起こる正気な理由を想像することもできません。詳細を説明しないと、システムの違いを説明するのが非常に難しくなります。
クレイグリンガー

2
この@Gardecoloの解決策を見つけることができましたか?ヨセミテにアップグレードした後も同じ問題が発生します。
Donovan

回答:


928

部分的に解決しました...

どうやら、最新バージョンのOS X(YosemiteやEl Capitanなど)をインストールすると、の一部のディレクトリが削除され/usr/local/var/postgresます。

これを修正するには、不足しているディレクトリを再作成するだけです。

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

または、より簡潔に(ネイトのおかげで):

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

再実行pg_ctl start -D /usr/local/var/postgresすると、サーバーは正常に起動し、少なくとも私にとっては、データを失うことはありません。

更新

私のシステムでは、Postgresが実行されている場合でも、これらのディレクトリの一部が空です。たぶん、いくつかの「クリーニング」操作の一環として、ヨセミテは空のディレクトリを削除しますか?いずれにせよ、私は先に進み、各ディレクトリに「.keep」ファイルを作成して、今後の削除を防ぎました。

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

.keepこれらのディレクトリにファイルを作成すると、ログファイルにノイズが発生しますが、他に悪影響を与えるようには見えません。


53
より簡潔なコマンドのための単なる提案:mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/そしてtouch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
Nate

26
これら.keepファイルは、実際に私のサーバーログにいくつかの悲しみを引き起こす:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
pg_snapshotsとpg_statディレクトリもありませんでした。
Jon Stevens、

8
また、追加のディレクトリ「pg_replslot」を1つ作成する必要がありました。それがうまく機能することを除いて。ありがとう!
ルーカス

6
ボトル入りのpostgres 9.4.0の@Lucasと同じ経験。私はしなければなりませんでした mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
パトリック・ファレル

9

Donavanの答えは正解です。データベース(たとえばrake db:test)でさまざまなことをしたので、追加したかったのです。それは、上記で言及されていないさまざまなディレクトリを探していて、それらが存在しない場合は窒息しました。私の場合pg_logical/mappings、あなたが実行している端末をセットアップしたいかもしれません:

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

通常のデータベースアクティビティを行っている間、フォルダが不足していないかどうかを確認します。


3
mkdir -p / usr / local / var / postgres / pg_logical / {snapshots、mappings}を追加する必要があります
peter_v

6

これは少し話題から外れていますが、PostgreSQL Yosemiteリカバリープロセスの一部としてここで注目する価値があります。上記と同じ問題があり、バックグラウンドで実行されているPostgreSQLに問題があるため、ディレクトリを追加した後でも再起動できませんでした。を使っpg_ctl stop -m fastてPostgreSQLサーバーを強制終了しましたが、うまくいきませんでした。また、プロセスを直接実行してみましたkill PIDが、その直後にPostgreSQLプロセスが別のPIDで再表示されました。

キーは.plist、Homebrewがロードしたファイルになりました...私のための修正は、次のようになりました:

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

その後、PostgreSQLを正常に起動することができました。


私のplistの名前は少し異なりましたlaunchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plistが、基本的には同じ問題であり、同じ解決策でした。
onekiloparsec 14年

4

不足しているディレクトリは、PostgreSQLデータディレクトリに存在する必要があります。デフォルトのデータディレクトリは/usr/local/var/postgres/です。別のデータディレクトリを設定した場合は、そこに不足しているディレクトリを再作成する必要があります。.plistPostgreSQLを起動するhomebrew推奨ファイルを変更した場合、そこにデータディレクトリがあります。

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

(それは-Dあなたがpostgresを開始したオプションです:)

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

上記の例では/usr/local/pgsql/data、次のように不足しているディレクトリをで作成します。

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

不足しているディレクトリの作成は確かに機能しますが、postgres dbを再初期化することで修正しました。これは、将来の問題を回避するためのよりクリーンなアプローチです。

注:この方法では、既存のデータベースが削除されます

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

19
明らかに、既存のデータベースを削除することは、ここでの小さな例外ではありません。これは、「/ var / tmpが見つからなかったため、オペレーティングシステムを再インストールしました」と少し言っています。
Adam Donahue、

4
ああ、男、これは私が考えることができるものよりも「きれい」です:) interwebzからのランダムなコピーペーストがこれを見ないでコンソールに直接撃たないことを
願っ

2
Gregの反対票を投じて申し訳ありませんが、このアプローチは開発でのみ使用するか、ユーザーがDBをワイプする余裕があるかどうかを明確にするために、ソリューションを言い換えることをお勧めします。
hraynaud 2014年

1
なぜこれはそんなに反対されているのですか?開発サーバーでは、これが正しい方法です。
Jordon Bedwell、2018

@JordonBedwellは、コンピューターでdbを使用して単一のアプリで遊んでいない限り、開発サーバー上でも悪い考えです。「お気に入りのコードエディターを起動できません。OSを再インストールしてみましょう」
Andre Figueiredo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.