在安装最新版本的OS X(Yosemite或El Capitan)后缺less`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系统,然后重新安装它,创build用户,表格,数据集等等。这太恶心了,但是它经常发生在我的系统上,几个月后说。

那么为什么经常会丢失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"? 

所以,如果你刚刚在优胜美地升级后经历过这个,现在你已经读完这篇文章了。

解决…部分。

显然,安装最新版本的OS X(例如Yosemite或El Capitan)会删除/usr/local/var/postgres中的一些目录。

要解决这个问题,只需重新创build缺less的目录:

 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现在可以正常启动服务器,至less对我而言,没有任何数据丢失。

UPDATE

在我的系统上,即使在运行Postgres时,其中的一些目录也是空的。 也许,作为一些“清洁”操作的一部分,优胜美地删除任何空目录? 无论如何,我继续在每个目录中创build一个“.keep”文件,以防止将来删除。

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

注意 :在这些目录中创build.keep文件会在日志文件中产生一些噪音,但不会对其他任何东西产生负面影响。

Donavan的答案是现货,我只是想补充说,因为我做了不同的事情与数据库(例如rake db:test ),它寻找不同的目录,上面没有提到,并会呛时,在我的情况下, pg_logical/mappings ,所以你可能想要build立一个terminal运行:

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

并在通过典型的数据库活动时观察丢失的文件夹。

这是有点偏离主题,但值得注意的是作为PostgreSQL优胜美地恢复过程的一部分。 我有同样的问题,如上所述,我有一个问题PostgreSQL“看似”在后台运行,所以即使添加目录后,我无法重新启动。 我尝试使用pg_ctl stop -m fast杀死PostgreSQL服务器,但没有运气。 我也尝试直接使用kill PID但是一旦PostgreSQL进程重新出现了一个不同的PID,

关键是最后成为一个.plist文件,家酿已经加载…对我的修复最终成为:

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

之后,我能够正常启动PostgreSQL。

缺less的目录需要存在于PostgreSQL数据目录中。 默认数据目录是/usr/local/var/postgres/ 。 如果您设置了不同的数据目录,则需要在那里重新创build丢失的目录。 如果您修改启动PostgreSQL的自制推荐的.plist文件,则可以在其中find数据目录:

 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创build丢失的目录,如下所示:

 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} 

创build丢失的目录当然有效,但我通过重新初始化postgres数据库来修复它,这是一个更清洁的方法来避免未来的问题。

注意:这种方法将删除现有的数据库

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