web-dev-qa-db-ja.com

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

私のOS Xでは自作の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):スレッドはこの問題のためのグーグルのトップヒットであり、多くの症状のために異なっているので、私はこれを追加する必要性を感じました。自作醸造者はこのエラーメッセージに遭遇するでしょう:

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

つまり、Yosemiteのアップグレード後にこれを経験したばかりの場合は、このスレッドを読んでいることになります。

458
Blaszard

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

どうやら、最新バージョンの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

もっと簡潔に(おかげで Nate):

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を再実行すると、サーバを正常に起動します。少なくとも私にとっては、データを失うことなく起動します。

UPDATE

私のシステムでは、Postgresが実行されていてもこれらのディレクトリのいくつかは空です。たぶん、いくつかの "クリーニング"操作の一環として、Yosemiteは空のディレクトリを削除しますか?いずれにせよ、私は先に行き、将来の削除を防ぐために各ディレクトリに '.keep'ファイルを作成しました。

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

Note:これらのディレクトリに.keepファイルを作成すると、ログファイルにノイズが発生しますが、悪影響はありません。何か他のもの。

924
Donovan

Donavan の答えがその場にあります。私はデータベースを使って別のことをしたので(例えばrake db:test)、それは別のものを探しに行きました。上記で言及されていないディレクトリ、存在しないときにはディレクトリが詰まる、私の場合はpg_logical/mappingsなので、端末を実行するように設定するとよいでしょう。

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

そして、あなたがあなたの典型的なデータベース活動を通して行っている間、足りないフォルダーのためにそれを見てください。

9
tony_k

これは少し話題から外れていますが、PostgreSQL Yosemiteの回復プロセスの一部としてここで注目する価値があります。私は上記と同じ問題を抱えていました、そして、私は再起動できないディレクトリを追加した後でさえも、私はPostgreSQLが "一見"バックグラウンドで実行されている問題を抱えていました。私はpg_ctl stop -m fastを使ってPostgreSQLサーバを終了させようとしましたが、運が悪くなりました。私はkill PIDを使って直接プロセスを追いかけようとしましたが、その直後にPostgreSQLプロセスが別のPIDで再登場しました。

キーはHomebrewがロードした.plistファイルであることになった...私のための修正は次のようになった:

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

その後、私はPostgreSQLを普通に起動することができました。

6
MCP

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

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

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

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