我在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升级之后经历过这个,那么现在你已经开始阅读这个帖子了。
答案 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