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


464

我在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):我觉得有必要添加它,因为线程是该问题在Google上的热门话题,而且许多症状是不同的。自制软件可能会遇到此错误消息:

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

因此,如果您是在优胜美地升级后刚刚经历的,现在就可以阅读本主题。


真的,真的不应该!当您说“最新版本”时,请显示确切的版本号。另外,您是否将任何表空间放在外部存储器上?PostgreSQL数据目录在哪里?
Craig Ringer 2014年

另外,pg_tblspc目录。我可以看到此目录且仅此目录随机消失的唯一方法是文件系统损坏或行为特别恶劣的病毒扫描程序或文件同步工具。
Craig Ringer 2014年

我没有任何病毒扫描程序。我不知道这tablespaces是什么,所以我不认为我将其放在外部存储上。
Blaszard 2014年

嗯 我只能告诉你的是,有什么大不了的pg_tblspc不仅会消失在我曾经遇到过的任何系统上,也无法想象一个理智的理由。如果没有更多细节,很难说出使您的系统与众不同的原因。
Craig Ringer 2014年

2
您能找到此@Gardecolo的解决方案吗?升级到优胜美地后,我遇到了同样的问题。
多诺万2014年

Answers:


928

解决了...部分。

显然,安装最新版本的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正在运行,其中一些目录还是空的。也许,作为某些“清理”操作的一部分,优胜美地会删除任何空目录吗?无论如何,我都会在每个目录中创建一个“ .keep”文件以防止将来删除。

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

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


53
只是建议使用更简洁的命令: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
Nate 2014年

26
这些.keep文件实际上使我在服务器日志中有些悲痛:could not open temporary-files directory "pg_tblspc/.keep/PG_9.3_201306121/pgsql_tmp": Not a directory
funwhilelost

13
我也缺少pg_snapshots和pg_stat目录。
乔恩·史蒂文斯

8
我还必须创建一个额外的目录“ pg_replslot”。除了工作正常。谢谢!
卢卡斯

6
与@Lucas的瓶装Postgres 9.4.0体验相同。我不得不 mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp,pg_replslot}
Patrick Farrell

9

Donavan的回答很明确,我只是想补充一点,因为我对数据库做了不同的事情(例如rake db:test),所以它去寻找上面没有提到的不同目录,当目录不存在时它们会阻塞。我的情况下pg_logical/mappings,因此您可能要设置运行终端:

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

并在进行典型的数据库活动时监视它是否缺少文件夹。


3
需要添加mkdir -p / usr / local / var / postgres / pg_logical / {snapshots,mappings}
peter_v 2015年

6

这有点不合时宜,但是在PostgreSQL Yosemite恢复过程中值得一提。我遇到了与上述相同的问题,并且在后台“似乎”运行PostgreSQL时遇到了问题,因此即使添加目录后也无法重新启动。我试图pg_ctl stop -m fast杀死PostgreSQL服务器,但是没有运气。我也尝试过直接使用该进程,kill PID但是一旦这样做,PostgreSQL进程就会重新出现,并带有另一个PID。

密钥最终.plist是Homebrew加载的文件...对我而言,此修复程序最终是:

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

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


我的plist的命名略有不同:launchctl unload ${HOME}/Library/LaunchAgents/homebrew.mxcl.postgresql.plist但是从根本上来说,这对我来说也是一个相同的问题,并且是相同的解决方案。
onekiloparsec 2014年

4

缺少的目录需要存在于PostgreSQL数据目录中。默认数据目录为/usr/local/var/postgres/。如果设置了其他数据目录,则需要在此处重新创建丢失的目录。如果您修改了.plist启动PostgreSQL 的自制程序推荐文件,则可以在此处找到数据目录:

cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

(这是-D您使用以下方法启动postgres 的选项:)

  <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}

-20

创建丢失的目录当然可以,但是我通过重新初始化postgres db进行了修复,这是一种避免将来出现问题的更干净的方法。

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

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

19
显然,删除现有数据库在这里并不是一个小例外。这有点像说“我找不到/ var / tmp,所以我重新安装了操作系统”。
亚当·多纳休

4
哦,伙计,这比我能想到的任何东西都“干净” :)只是希望从interwebz那里获得一些随机复制的贴图,不要不看它就直接将其拍摄到他们的控制台中:)
HalilÖzgür14年

2
抱歉,Greg对此表示反对,但我建议您改写您的解决方案,以明确表明此方法仅应在开发中使用,或者在用户有能力擦除其数据库的情况下使用。
hraynaud 2014年

1
为什么这么低估?在开发服务器上,这是正确的方法。
乔登·贝德威尔

@JordonBedwell甚至在开发服务器上也是个坏主意,除非您在计算机上使用db来玩一个应用程序。这就像“我无法启动我最喜欢的代码编辑器,让我们重新安装操作系统”
Andre Figueiredo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.