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

Bla*_*ard 461 postgresql macos 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"?
Run Code Online (Sandbox Code Playgroud)

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

Don*_*van 926

解决了...部分.

显然,安装最新版本的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
Run Code Online (Sandbox Code Playgroud)

或者,更简洁(感谢Nate):

mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/
Run Code Online (Sandbox Code Playgroud)

重新运行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
Run Code Online (Sandbox Code Playgroud)

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

  • 只是建议更简洁的命令:`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` (53认同)
  • 那些.keep文件实际上让我对服务器日志感到悲伤:`无法打开临时文件目录"pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp":不是目录` (25认同)
  • 我也缺少pg_snapshots和pg_stat目录. (13认同)
  • 我还必须创建一个额外的目录'pg_replslot'.除了它工作正常.谢谢! (8认同)
  • 经验丰富的@Lucas瓶装postgres 9.4.0.我不得不`mkdir/usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot} (6认同)
  • 经验丰富,但必须运行以下内容才能获得没有警告或错误的server.log:`mkdir -p/usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot,pg_stat,pg_logical/snapshots,pg_logical /映射,pg_snapshots} /`.这是针对brew postgresql 9.4.1 (3认同)
  • 我不得不添加`/ usr/local/var/postgres/pg_logical/snapshots`和`/ usr/local/var/postgres/pg_logical/mappings`来启动服务器.(Yosimite,brew install homebrew/versions/postgresql94) (3认同)
  • 您可能不需要创建所有三个目录(我只需要创建两个目录).在启动postgres时运行`pg_ctl -D/usr/local/var/postgres -l /usr/local/var/postgres/server.log start -w`以获得更好的输出.然后执行`tail -5/usr/local/var/postgres/server.log`以查看启动时的错误.错误将指示缺少哪些目录. (2认同)

ton*_*y_k 9

多纳万的回答是现实的,我只是想补充一点,因为我对数据库做了不同的事情(例如rake db:test),它寻找上面没有提到的不同目录,当它们不存在时会窒息,我的情况pg_logical/mappings,所以你可能想设置一个终端运行:

tail -f /usr/local/var/postgres/server.log
Run Code Online (Sandbox Code Playgroud)

通过典型的数据库活动观察丢失的文件夹.

  • 需要添加mkdir -p/usr/local/var/postgres/pg_logical/{snapshots,mappings} (3认同)

MCP*_*MCP 6

这稍微偏离主题,但值得注意的是PostgreSQL Yosemite恢复过程的一部分.我有与上面相同的问题,我遇到了PostgreSQL"貌似"在后台运行的问题所以即使在添加目录后我也无法重启.我试图pg_ctl stop -m fast用来杀死PostgreSQL服务器,但没有运气.我也尝试直接使用该过程,kill PID但是一旦我这样做,PostgreSQL进程就会重新出现一个不同的PID.

该密钥最终成为.plistHomebrew已加载的文件...对我的修复最终成为:

launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist
Run Code Online (Sandbox Code Playgroud)

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