安装最新版OS X(Yosemite或El Capitan)后缺少`pg_tblspc`

时间:2014-09-22 08:58:00

标签: macos postgresql homebrew osx-yosemite

我在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): 我觉得有必要添加这个,因为这个问题对谷歌来说是最受欢迎的,而且很多症状都不同。 Homebrewers可能会遇到此错误消息:

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

所以,如果你刚刚在Yosemite升级之后经历过这个,那么现在你已经开始阅读这个帖子了。

6 个答案:

答案 0 :(得分:924)

解决了......部分。

显然,安装最新版本的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现在正常启动服务器,至少对我而言,没有任何数据丢失。

<强>更新

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

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

注意 :在这些目录中创建.keep文件会在日志文件中产生一些噪音,但似乎不会对任何内容产生负面影响别的。

答案 1 :(得分:9)

Donavan的答案很明显,我只是想补充一点,因为我对数据库做了不同的事情(例如rake db:test),它寻找不同的目录,避开&# 39;上面已经提到了,并且在他们没有出现时会窒息,在我的情况下pg_logical/mappings,所以你可能想设置一个终端运行:

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

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

答案 2 :(得分:6)

这稍微偏离主题,但值得注意的是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。

答案 3 :(得分:4)

缺少的目录需要存在于PostgreSQL数据目录中。默认数据目录为/usr/local/var/postgres/。如果您设置了不同的数据目录,则需要在那里重新创建缺少的目录。如果您修改了启动PostgreSQL的自制软件推荐的.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 :(得分:0)

我在使用dockerized的Rails应用程序时遇到了这个问题。

/ usr / local / var / postgres中缺少pg_tblspc和其他目录,而在myRailsApp / tmp / db中缺少了它们。

您将要使用Donovan解决方案的类似版本,只需更改即可为Rails应用提供正确的路径...

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

此外,您将要添加一个.keep文件,以确保git不会忽略空目录。

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

我注意到其中1个目录中的.keep错误,因此请仔细阅读命令行输出并根据需要进行调整。

答案 5 :(得分:-20)

创建丢失的目录肯定有效但我通过重新初始化postgres db来修复它,这是一种避免将来出现问题的更简洁的方法。

注意:此方法将删除现有数据库

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