osx - 安装OS X Yosemite时提示 `pg_tblspc` 丢失

  显示原文与译文双语对照的内容

我使用从 Homebrew postgres OS X, 但是当我重启系统,有时postgres不重启后开始,所以我试图手动启动它 postgres -D/usr/local/var/postgres ,但随后出现了以下消息: FATAL: could not open directory"pg_tblspc": No such file or directory

最后一次发生,我不能让它原来的状态,所以我决定卸载整个postgres系统然后re-installed创建用户、表、数据集, 等等 。 虽然很恶心,但它经常出现在我的系统中,比如在几个月内。

那么为什么它经常丢失 pg_tblspc 文件? 我可以做什么来避免文件丢失?

我还没有将 Homebrew 和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升级之后经历了这个,现在你就可以阅读这个线程了。

时间:

已经解决。。部分。

显然,安装最新版本的OS X ( 例如。 /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

或者更简洁地说,( 由于内特 ):


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 文件会在日志文件中创建一些噪音,但不会对其他文件产生负面影响。

这是轻微的off-topic,但值得注意的是,它是postgres恢复过程的一部分。 我与上面的问题有同样的问题,我在后台运行了 postgres"似乎",所以即使添加了目录我也无法重新启动。 我试着使用 pg_ctl stop -m fast 杀死postgres服务器但没有成功。 我还尝试使用 kill PID 直接完成这个流程,但是一旦我完成了,一个带有不同PID的postgres进程 re-appeared 。

关键是". plist"文件 Homebrew 加载。。 我的修复结果是: launchctl unload/Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist 之后,我就可以正常启动 postgres 。

希望有助于你。

Donavan的答案是 spot,我只是想添加与数据库不同的东西( 例如。 rake db:test ),它在查找上面没有提到的不同目录,并在不存在时阻塞它们,在我的案例中,可能需要安装一个终端:

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

当你通过典型的数据库活动时,查看丢失的文件夹。

我将把它作为评论发表在引用的答案上,但没有评论的代表。

缺少的目录需要出现在你的postgres数据文件目录中。 默认的数据目录是 /usr/local/var/postgres/ 。 如果你已经设置了不同的数据目录,你需要在那里找到丢失的目录。 如果你修改了启动postgres的homebrew-recommended .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}

创建丢失的目录当然可行,但我通过 reinititializing postgres数据库修复了它,这是一个避免以后问题的方法。

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


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

...