私の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のアップグレード後にこれを経験したばかりの場合は、このスレッドを読んでいることになります。
部分的に解決しました...
どうやら、最新バージョンの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
ファイルを作成すると、ログファイルにノイズが発生しますが、悪影響はありません。何か他のもの。
Donavan の答えがその場にあります。私はデータベースを使って別のことをしたので(例えばrake db:test
)、それは別のものを探しに行きました。上記で言及されていないディレクトリ、存在しないときにはディレクトリが詰まる、私の場合はpg_logical/mappings
なので、端末を実行するように設定するとよいでしょう。
tail -f /usr/local/var/postgres/server.log
そして、あなたがあなたの典型的なデータベース活動を通して行っている間、足りないフォルダーのためにそれを見てください。
これは少し話題から外れていますが、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を普通に起動することができました。
足りないディレクトリは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}